为什么结果为“3:1 0 0 4”,当我们增加x? 为什么不是“3:1 1 0 4”?
x=0;y=4;z=3;
printf("3: %d %d %d %d\n", ++x || !y, x&&y, !z, y);
答案 0 :(得分:3)
printf("3: %d %d %d %d\n", ++x || !y, x&&y, !z, y);
由于++x
, !y
会在||
之前进行评估。 !y
仅在++x
结果为0时进行评估。
但++x || !y
与x&&y
评估没有明确的顺序。代码缺少序列点。
答案 1 :(得分:1)
如果您使用cc
进行编译,则会收到警告:
warning: unsequenced modification and access to 'x' [-Wunsequenced]`
修改变量并在printf
内的其他地方访问它是未定义的行为,不会给出逻辑结果,也不会给每个编译器带来相同的结果。
答案 2 :(得分:0)
正如@Sami在他的评论中提到的,参数被评估的顺序是特定于编译器的,并且可能取决于调用约定。在您的情况下,x && y
参数首先在++x || !y
之前计算。