我刚刚复习我的 C++。我尝试这样做:
#include <iostream>
using std::cout;
using std::endl;
void printStuff(int x);
int main() {
printStuff(10);
return 0;
}
void printStuff(int x) {
cout << "My favorite number is " + x << endl;
}
问题发生在
printStuff
函数中。当我运行它时,输出中省略了“My favorite number is”中的前 10 个字符。输出是“e number is”。连号码都没有显示出来。
解决这个问题的方法就是这样做
void printStuff(int x) {
cout << "My favorite number is " << x << endl;
}
我想知道计算机/编译器在幕后做什么。
本例中的 + 重载运算符不会连接任何字符串,因为 x 是整数。在这种情况下,输出会移动右值时间。所以前 10 个字符不会被打印。检查这个参考。
如果你愿意写的话
cout << "My favorite number is " + std::to_string(x) << endl;
会起作用的
这是简单的指针算术。字符串文字是一个数组或
char
并将显示为指针。您将 10 添加到指针,告诉您要从第 11 个字符开始输出。
没有 + 运算符可以将数字转换为字符串并将其连接到字符数组。
添加或增加字符串不会增加其包含的值,但会增加地址:
这不是 msvc 2015 或 cout 的问题,而是它在内存中前后移动: 向你证明 cout 是无辜的:
#include <iostream>
using std::cout;
using std::endl;
int main()
{
char* str = "My favorite number is ";
int a = 10;
for(int i(0); i < strlen(str); i++)
std::cout << str + i << std::endl;
char* ptrTxt = "Hello";
while(strlen(ptrTxt++))
std::cout << ptrTxt << std::endl;
// proving that cout is innocent:
char* str2 = str + 10; // copying from element 10 to the end of str to stre. like strncpy()
std::cout << str2 << std::endl; // cout prints what is exactly in str2
return 0;
}