2017-04-27 75 views
1
#include <stdio.h> 
main() 
{ 
    int x = 1, y = 0, z = 5; 
    int a = x && y || z++; 
    printf("%d", z); 
} 

此代码给我输出:6C编程增量逻辑错误

#include <stdio.h> 
main() 
{ 
    int x = 1, y = 0, z = 5; 
    int a = x && y && z++; 
    printf("%d", z); 
} 

此代码给我输出:5

为什么第二程序给出输出中为5即使z为递增相同像第一个程序一样?

+0

“||”和“|”之间的区别 与上面相同,在“||”的情况下,只执行一个语句,如果返回“true”,则其他语句不会执行。但是,如果第一个是错误的,那么将检查其他值是否为“真”。原因是“或”运营商的工作方式。 “或”运算符仅依赖于一个真实的,换句话说,如果任何表达式都为真,那么结果将为真。 –

+0

https://www.codeproject.com/Articles/662248/Difference-between-and-and –

回答

2

&&运营商(以及||运营商)是一个短路运营商。这意味着如果左操作数计算结果为false,则无论右操作数如何,结果均为false,因此不计算右操作数。左到右

不同于按位二进制&操作者,&&操作者保证评价;:

C standard第6.5.13如果第二操作数是 求值,则在第一和第二操作数的评估 之间存在序列点。 如果第一个操作数 的值等于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增加。

3

x && y && z++由于y==0而在y之后停止评估。 z++未执行。

0

在此声明

int a = x && y || z++; 

的初始化相当于

int a = (x && y) || (z++); 

根据C标准相对于逻辑OR运算符(6.5至。14逻辑或操作符)

4 ...如果第一个操作数比较不等于0,则第二个操作数是 未评估。

然而,(x && y)的第一个操作数等于0(由于变量y等于0)。因此第二个操作数(z++)被评估。

在此声明

int a = x && y && z++; 

的初始化相当于

int a = (x && y) && (z++); 

根据C标准相对于所述逻辑AND运算符至(6.5.13逻辑与运算符)

4 ...如果第一个操作数等于0,则第二个操作数是 未评估

因此,当第一个操作数(x && y)等于0时,第二个操作数(z++)不被计算。