#include <stdio.h>
int main(){
int b = 10;
char ch = 33^b&1;
for(;"what"[b+++21];)
printf("%c",ch);
}
此代码的输出是两个!迹象。
我无法理解它是如何工作的以及for循环的条件语句的含义是什么(“什么”[b +++ 21])。
为什么循环只运行两次?
答案 0 :(得分:3)
代码具有未定义的行为,它可能会在您的系统上打印2 !
,但它可能会在不同的系统上执行完全不同的操作,实际上我并不想飞行一架运行的飞机它在导航系统上。
重新格式化代码使其更加明确:
#include <stdio.h>
int main() {
int b = 10;
char ch = 33 ^ b & 1;
for (;"what"[b++ + 21];)
printf("%c", ch);
}
以下是发生的事情:
b
初始化为值10
。ch
初始化为值(33 ^ (b & 1))
。由于10
为偶数,b & 1
为0
,因此ch
的值为33
,十六进制为:0x21
,即字符{{ ASCII中的1}}。!
循环检查字符串文字for
中元素的值,该字符串是"what"
的数组,其值为char
。索引计算为{ 'w', 'h', 'a', 't', 0 }
。第一个值为b++ + 21
,31
递增为b
。这里有未定义的行为,因为您正在引用5字节数组的第32个元素。任何事情都可能发生。从内存中读取此字节可能会导致崩溃或只返回一些随机值。循环的进一步迭代深入挖掘未知。在您的计算机上,需要2次迭代才能找到空字节,因此11
运行两次,但在其他机器或其他时间,任何事情都可能发生。
这项测试是假的,更可靠的替代方案是:
printf