#include <stdio.h>
main()
{
int x = 1, y = 0, z = 5;
int a = x && y || z++;
printf("%d", z);
}
这段代码给出了输出:6
#include <stdio.h>
main()
{
int x = 1, y = 0, z = 5;
int a = x && y && z++;
printf("%d", z);
}
这段代码给了我输出:5
为什么第二个程序将输出设为5,即使z在第一个程序中增加相同?
答案 0 :(得分:3)
x && y && z++
之后y
的{{1}}停止评估,因为y==0
。 z++
未执行。
答案 1 :(得分:3)
&&
运算符(以及||
运算符)是一个短路运算符。这意味着如果左操作数计算为false,则无论右操作数如何,结果都为false,因此不评估右操作数。
来自C standard的第6.5.13节:
4 与按位二进制
&
运算符不同,&&
运算符保证从左到右的评估; 如果第二个操作数是 评估后,评估之间存在一个序列点 第一和第二个操作数。 如果是第一个操作数 比较等于0,不评估第二个操作数。
所以在这个表达式的情况下:
x && y && z++;
首先评估 x && y
。由于x
为1,因此y
被评估并发现为0,因此第一个&&
的结果为0.现在我们有:
0 && z++
由于左操作数为0,因此不评估右操作数。这意味着z
不会增加。
这与第一段代码中的表达形成对比:
x && y || z++
和以前一样,x && y
评估为0,留下我们:
0 || z++
由于左操作数为0,因此需要计算右操作数。这会导致z
增加。
答案 2 :(得分:1)
此声明中的初始化程序
int a = x && y || z++;
相当于
int a = ( x && y ) || ( z++ );
根据C标准相对于逻辑OR运算符(6.5.14逻辑OR运算符)
4 ...如果第一个操作数比较不等于0,则第二个操作数为 没有评估。
然而,( x && y )
的第一个操作数比较等于0(由于变量y
等于0)。因此,第二个操作数( z++ )
被评估。
此声明中的初始化程序
int a = x && y && z++;
相当于
int a = ( x && y ) && ( z++ );
根据C标准相对于逻辑AND运算符(6.5.13 Logical AND运算符)
4 ...如果第一个操作数比较等于0,则第二个操作数为 未评估
因此,当第一个操作数( x && y )
比较等于0时,则不评估第二个操作数( z++ )
。