gpt4 book ai didi

c++ - C++ While 语句和字符串处理混淆?

转载 作者:行者123 更新时间:2023-11-27 23:56:51 33 4
gpt4 key购买 nike

const char ca[] = {'h','e','l','l','o'};
const char *cp = ca;
// printf("%s\n",cp);
while(*cp) {
cout << *cp << endl;
++cp;
}

首先打印:

 h
e
l
l
o
// end

然后我取消注释“printf”语句:

hello%s

h
e
l
l
o
%
s


// end

为什么结果如此不同?“While”条件如何退出(*cp 的确切值)?C++ 入门第 5 页 110

最佳答案

while(*cp)

这个循环条件一直循环下去,直到找到一个 NUL 字符。它相当于:

while(*cp != '\0')

ca 不是以 NUL 终止的,因此循环运行到数组的末尾并调用未定义的行为。未定义的行为意味着任何事情都可能发生。

要解决这个问题,添加一个 NUL 终止符

const char ca[] = {'h','e','l','l','o','\0'};

或者,等价地,

const char ca[] = "hello";

<支持> 看来在第一种情况下循环会立即结束,因为内存中恰好有一个 NUL 字节跟在 'o' 之后。但在第二种情况下,"%s" 字符串恰好与 ca 相邻,因此它也被打印出来了。 "%s" 是一个正确的 NUL 终止,因此循环在打印后结束。

<支持>无害的 printf() 调用可以改变不相关循环的行为这一事实是未定义行为是多么不可预测的一个例子。它并不总是那么温和。它可能会使您的程序崩溃。它甚至可以让它继续工作一段时间,然后以一种完全莫名其妙的方式行为不端。不要依赖于可预测行为的未定义行为。

关于c++ - C++ While 语句和字符串处理混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42081243/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com