![](/img/trans.png)
[英]Why does concatenation of a string an char in C++ return an empty string?
[英]Why does this int and string concatenation give this output in C++
for(int i=0;i<10;i++)
{
cout << i+"passs" << "\n";
}
这产生如下输出:
passs
asss
sss
ss
s
现在我的想法是我们正在看一个指针操作,其中计数器i被添加以传递char指针,我们看到“passs”指针输出+ 0,“传递”指针+ 1等。
问题是当它到达空字符时它为什么不停止,因为它打印5个空白行。
接下来是cout << "passs"+i << "\\n";
打印相同的东西。 我认为这应该从第二个位置打印所有空行,因为这次传递指针应该可能是从最后一个位置。 在阅读我在这里写的内容时,看到第二个cout的输出将是它的方式可能是有意义的。
我想知道我是否正确思考,是否还有更多我不理解的内容?
你是对的。
字符串文字被解释为指向字符串开头的指针。 向此添加int是指针增量。
一旦你走到了尽头,你就会陷入未定义的行为 - 它对你的系统来说似乎相当无害,但可能会在另一个系统上以coredump结束。
这是因为字符串文字被视为指针(指针算术):向指针添加一个整数向前移动指针:
"passs" + 1 = "asss"
"passs" + 2 = "sss"
"passs" + 3 = "ss"
要将数字添加为字符串,您应该使用:
cout << i << "passs" << "\n";
你是对的, pointer + integer
和integer + pointer
操作指针算术并给出一个新的指针,因此输出是“正常的”。
你的初步推理是正确的。 你在这里做指针运算,所以输出的前六行(第六行是\\0\\n
)是好的。 但是当你走出弦乐的末尾时,你会遇到麻烦。 你的for循环中没有任何东西可以停止迭代,所以你的程序理论上可以用"passs"
+ 6,7,8和9做任何事情。让我们看看为什么。
回想一下,字符串文字的类型为const char *
。 在编译器确定的内存中的某个位置,您有:
| p | a | s | s | s | \0 | * | * | * | * |
*
符号表示在你的字符串结尾之后没有人的不确定记忆的土地。 当你的for循环运行时,它从p
开始并向前走。 因为我们正在寻址一个const char *
,所以每一步都是一个字节。 在每一步中, cout
尝试尽可能多地打印,直到达到空字符(如输出中所示)。 但你不能尝试从无人区域打印任何东西。 这样做会导致未定义的行为 。 在您的情况下,该内存包含不可打印的字符。
总而言之,你大多是正确的。 当cout
达到cout
,它确实停止了打印。 但是for循环却没有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.