[英]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.