你能解释一下这个C程序的输出吗?

时间:2016-02-27 13:04:44

标签: c

#include <stdio.h>
int main(){
    int b = 10;
    char ch = 33^b&1;
    for(;"what"[b+++21];)
    printf("%c",ch);
}

此代码的输出是两个!迹象。

我无法理解它是如何工作的以及for循环的条件语句的含义是什么(“什么”[b +++ 21])。

为什么循环只运行两次?

1 个答案:

答案 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 & 10,因此ch的值为33,十六进制为:0x21,即字符{{ ASCII中的1}}。
  • !循环检查字符串文字for中元素的值,该字符串是"what"的数组,其值为char。索引计算为{ 'w', 'h', 'a', 't', 0 }。第一个值为b++ + 2131递增为b。这里有未定义的行为,因为您正在引用5字节数组的第32个元素。

任何事情都可能发生。从内存中读取此字节可能会导致崩溃或只返回一些随机值。循环的进一步迭代深入挖掘未知。在您的计算机上,需要2次迭代才能找到空字节,因此11运行两次,但在其他机器或其他时间,任何事情都可能发生。

这项测试是假的,更可靠的替代方案是:

printf