2

在下面的代码中:

#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;
}

我期望输出是:

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

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

int d = a-- && --b;

输出是:

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

谁能解释一下?

4

6 回答 6

5

在第一种情况下

int c = a || --b;  

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

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

int d = a-- && --b;

a-- is post decrementso decrement of awill not effect in expression where as --bis pre decrementso effects here

你的情况变成

   int d= 1 && 0 ; 

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

于 2013-10-26T12:17:55.463 回答
4

在第一个or操作中,--b不执行,因为a等于 1:

int c = a || --b;

b在这里递减:

int d = a-- && --b;

因为a等于 1 并在计算后递减(a--等于 1)。换句话说,这一行类似于:

int d = 1 && --b;

b等于 1,所以现在b等于 0。也d等于 0,因为--b返回 0。

于 2013-10-26T12:24:16.450 回答
4
int c = a || --b;

在这一行中,C 标准要求C 实现首先评估a,如果不为零,则不评估 --b。虽然--具有比 更高的优先级||,但这只是意味着它--被分组b是为了确定表达式的结构,而不是为了评估它。||运算符的左侧必须在右侧之前评估,如果左侧为真,则不得评估右侧,即使是部分。

所以,经过上述,b是没有改变的;它仍然是 1。

int d = a-- && --b;

与 一样,首先评估||的左侧。&&如此a--评价。这变为a0。但是,值a--a在更改之前,所以它是 1。值 0 将阻止计算右侧(因为,一旦我们知道左侧为零,我们就知道完整&&的表达式为零)。但是,由于左边不为零,--b必须求值才能完成&&。这变为b0。“短路”意味着首先评估左侧,但在必要时仍评估右侧。

于 2013-10-26T12:32:27.043 回答
2

下面的行,即a--返回 0

不,它没有。它产生 1,因为后减运算符计算为变量的未修改值。你在想的也许是--a

于 2013-10-26T12:19:23.097 回答
1

c = a || --b

所以起初a is evaluateda价值是1哪个是true。所以编译器不评估--b. 所以b价值还是1

现在

d = a-- && --b

a-- && --b=> 1 && 0(since --b = 0) 因为bvalue 是 at 1

为什么1 because a-- is post decrement operator

为什么0 because --b is pre decrement operator

所以 1 && 0 返回 0 并且这个值存储在 d

所以输出: a = 0, b = 0, c = 1, d = 0

于 2013-10-26T12:37:18.070 回答
-2

你混在一起a----a。表达式的结果a--在减量a 之前,while--a在减量a 之后;换句话说:

int a = 1;
int b = a--; // b == a == 1
int c = --b; // c == b-1 == 0

结果,您有:

int d = a-- && --b;
// =>   1   && b-1
// =>   1   && 0
// =>   0
于 2013-10-26T12:17:21.000 回答