C

时间:2016-10-29 21:42:59

标签: c

为什么结果为“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);  

3 个答案:

答案 0 :(得分:3)

printf("3: %d  %d %d %d\n", ++x || !y, x&&y, !z, y); 
由于++x

!y会在||之前进行评估。 !y仅在++x结果为0时进行评估。

++x || !yx&&y评估没有明确的顺序。代码缺少序列点

答案 1 :(得分:1)

如果您使用cc进行编译,则会收到警告:

warning: unsequenced modification and access to 'x' [-Wunsequenced]`

修改变量并在printf内的其他地方访问它是未定义的行为,不会给出逻辑结果,也不会给每个编译器带来相同的结果。

答案 2 :(得分:0)

正如@Sami在他的评论中提到的,参数被评估的顺序是特定于编译器的,并且可能取决于调用约定。在您的情况下,x && y参数首先在++x || !y之前计算。