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

时间:2012-02-07 13:32:41

标签: c++

for(int i=0;i<10;i++)
{
  cout << i+"passs" << "\n";
}

这产生如下输出:

passs
asss
sss
ss
s

现在我的想法是我们正在看一个指针操作,其中计数器i被添加以传递char指针,我们看到来自“传递”指针+ 0的输出,“传递”指针+ 1等。

问题是为什么当它达到空字符时它不会停止,因为它会打印5个空行。

接下来是cout << "passs"+i << "\n";打印相同的东西。我认为这应该从第二个位置打印所有空行,因为这次传递指针应该可能是从最后一个位置。在阅读我在这里写的内容时,可能有必要看到第二个cout的输出就是这样。

我想知道我是否正确思考,是否还有更多我不理解的内容?

4 个答案:

答案 0 :(得分:4)

你是对的。

字符串文字被解释为指向字符串开头的指针。向此添加一个指针增量。

一旦你走到了尽头,你就会陷入未定义的行为 - 它对你的系统来说似乎相当无害,但可能会在另一个系统上以coredump结束。

答案 1 :(得分:2)

这是因为字符串文字被视为指针(指针算术):向指针添加整数会向前移动指针:

"passs" + 1 = "asss"
"passs" + 2 = "sss"
"passs" + 3 = "ss"

将数字添加为您应该使用的字符串:

cout << i << "passs" << "\n";

答案 2 :(得分:2)

你是对的,pointer + integerinteger + pointer都操作指针算术并给出一个新的指针,因此输出是“正常的”。

答案 3 :(得分:2)

您的初步推理是正确的。你在这里做指针算术,所以输出的前六行(第六行\0\n)是好的。但是当你走出弦乐的末尾时,你会遇到麻烦。你的for循环中没有任何东西可以停止迭代,所以你的程序理论上可以对"passs" + 6,7,8和9做任何事情。让我们看一下原因。

回想一下,字符串文字的类型为const char *。在编译器确定的内存中的某个位置,您有:

| p | a | s | s | s | \0 | * | * | * | * |

*符号表示在你的字符串结尾之后没有人的不确定记忆。当你的for循环运行时,它从p开始并向前走。由于我们正在寻址const char *,因此每一步都是一个字节。在每一步,cout尝试尽可能多地打印,直到达到空字符(如输出中所示)。但你不能尝试从无人区域打印任何东西。这样做会导致未定义的行为。在您的情况下,该内存包含不可打印的字符。

总而言之,你大多是正确的。 cout确实在达到空值时停止打印。但是for-loop却没有。