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的输出就是这样。
我想知道我是否正确思考,是否还有更多我不理解的内容?
答案 0 :(得分:4)
你是对的。
字符串文字被解释为指向字符串开头的指针。向此添加一个指针增量。
一旦你走到了尽头,你就会陷入未定义的行为 - 它对你的系统来说似乎相当无害,但可能会在另一个系统上以coredump结束。
答案 1 :(得分:2)
这是因为字符串文字被视为指针(指针算术):向指针添加整数会向前移动指针:
"passs" + 1 = "asss"
"passs" + 2 = "sss"
"passs" + 3 = "ss"
将数字添加为您应该使用的字符串:
cout << i << "passs" << "\n";
答案 2 :(得分:2)
你是对的,pointer + integer
和integer + 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却没有。