繁体   English   中英

为什么这个int和字符串连接在C ++中给出了这个输出

[英]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 + integerinteger + 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM