繁体   English   中英

此C代码如何同时求值为0而不是0?

[英]How can this C code evaluate to 0 and not 0 at the same time?

我一直在尝试一些有关代码混淆的竞赛 (我知道不是一种好的编程习惯,但这是我和一个朋友正在竞争的挑战,因此无需指出明显的问题),并且其中之一是,我发现t-scanf("%d",t--?&N:&t)表达式具有以下怪异行为(代码已简化为仍然可以重现该行为t-scanf("%d",t--?&N:&t)

int main(int t, int N){
    printf("%d\n",t-scanf("%d",t--?&N:&t));
}

int main(int t, int N){
    printf("%d\n",t-scanf("%d",t--?&N:&t)==0);
}

int main(int t, int N){
    printf("%d\n",t-scanf("%d",t--?&N:&t)!=0);
}

如果执行第一部分,将打印0 ,即表达式的计算结果为0。

在第二个上,将打印0 ,即表达式不求值0。

在第三个位置,将打印1 ,表示该表达式的值不等于0。

因此问题是:这些代码段有什么问题?

这些代码示例会导致未定义的行为,因为在表达式开始时t--相对于t没有t--

这里的顺序关系是:

  • t--在三元运算符中的其他表达式之前排序
  • scanf的参数使用scanf的返回值之前均已排序

但是!=-没有测序的关系,所以这些关系不限制t之前评估t-- ,反之亦然,因此行为是不确定的。


作为解决方法,您可以编写:

int temp = t;
printf("%d\n", temp - scanf("%d",t--?&N:&t));

t--是在scanf主体执行之前进行排序的 ,因此增量将在scanf可能覆盖t之前安全地完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM