C编程增加逻辑错误

时间:2017-04-27 01:03:09

标签: c operators

#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在第一个程序中增加相同?

3 个答案:

答案 0 :(得分:3)

x && y && z++之后y的{​​{1}}停止评估,因为y==0z++未执行。

答案 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++ )