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
然后我取消注释&#34; printf&#34;语句:
hello%s
h
e
l
l
o
%
s
// end
为什么结果如此不同?&#34; while&#34;条件退出(* cp的确切值)? C ++入门第5页第110页
答案 0 :(得分:3)
while(*cp)
此循环条件循环,直到找到NUL字符。它相当于:
while(*cp != '\0')
ca
不是NUL终止的,所以循环运行在数组的末尾并调用未定义的行为。未定义的行为意味着任何事情都可能发生。†
要解决此问题,请添加带
的NUL终结符const char ca[] = {'h','e','l','l','o','\0'};
或等同地
const char ca[] = "hello";
†看来在第一种情况下,循环立即结束,因为在'o'
之后的内存中恰好有一个NUL字节。但在第二种情况下,"%s"
字符串碰巧与ca
相邻,因此也会被打印出来。 "%s"
是一个正确的NUL终止,因此循环在打印后结束。
功能
无害的printf()
调用可以改变不相关循环的行为这一事实是一个不可预测的未定义行为的例子。它并不总是那么温和。它可能会使您的程序崩溃。它甚至可以使它继续工作一段时间,然后以完全莫名其妙的方式行为不端。不要依赖于可预测行为的未定义行为。
功能