在递增/递减运算符的情况下AND的短路

san*_*n45 2 c short-circuiting logical-operators

在下面的代码中:

#include <stdio.h>

int main()
{
     int a = 1;
     int b = 1;
     int c = a || --b;
     int d = a-- && --b;
     printf("a = %d, b = %d, c = %d, d = %d", a, b, c, d);
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

我期待输出是:

A = 0,B = 1,C = 1,d = 0

因为由于下面一行中的短路,即a--返回0,所以另一部分不会被执行正确?

int d = a-- && --b;
Run Code Online (Sandbox Code Playgroud)

输出是:

a = 0,b = 0,c = 1,d = 0

有人可以解释一下吗?

Gan*_*har 5

在第一种情况下

int c = a || --b;  
Run Code Online (Sandbox Code Playgroud)

在此之后a=1,b=1c=1

a值是1,因为--b没有进行短路评估

int d = a-- && --b;
Run Code Online (Sandbox Code Playgroud)

a--post decrement这样的递减a那里不会表达的影响的--bpre decrement这样的效果在这里

你的病情变了

   int d= 1 && 0 ; 
Run Code Online (Sandbox Code Playgroud)

在此a=0;之后b=0,c=1d=0.

  • @Maxime:它因为最初错了而被投票否决了; 它说`--b`首先执行.从那时起它就被编辑了. (3认同)