【问题标题】:Can you please explain the output of this C program? [closed]你能解释一下这个C程序的输出吗? [关闭]
【发布时间】:2016-02-27 13:04:43
【问题描述】:
#include <stdio.h>
int main(){
    int b = 10;
    char ch = 33^b&1;
    for(;"what"[b+++21];)
    printf("%c",ch);
}

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

我无法理解它是如何工作的,for循环的条件语句是什么意思(“what”[b+++21])。

为什么循环只运行了两次?

【问题讨论】:

  • 我认为这个程序会导致超出范围的数组访问,输出会不确定。
  • +++ 被解析为 ++ + 。如果还是不明白,请尝试说的更具体一些
  • @MikeCAT 超出范围数组访问导致未定义行为
  • @Jean-BaptisteYunès:printffor 循环的主体。我想,缺乏缩进是混淆的一部分。未定义的行为可能是预期的讨论主题,但我不确定。
  • 多么完整的一堆……作业:(

标签: c


【解决方案1】:

代码具有未定义的行为,它可能会在您的系统上打印 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 &amp; 1))。由于10 是偶数,所以b &amp; 10,所以ch 的值是33,十六进制:0x21,即ASCII 中的字符!
  • for 循环检查字符串文字 "what" 中元素的值,这是一个包含 5 个 char 的数组,其值为 { 'w', 'h', 'a', 't', 0 }。索引计算为b++ + 21。第一个值为31b 递增为11。这里有未定义的行为,因为您引用的是 5 字节数组的第 32 个元素。

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

这个测试是假的,更可靠的替代方法是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多