为什么c不会在输出中递增?

Nis*_*sha 5 c short-circuiting

我正在研究C的基础知识并试图解决下面的问题,任何人都可以解释为什么变量的输出c不同?

以下程序的输出是什么?

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

答案:-2,3,0,1

为什么c输出中没有增加?

Jon*_*ler 10

变量c不会递增,因为||除非LHS求值为false,否则不会执行a 的RHS(右侧),并且LHS的计算结果为true.C ||&&运营商是"短路"运营商; 他们不评估第二个操作数,除非第一个操作数不足以确定表达式的整体真实性.

&&比更紧密的结合||,所以操作可以括号为:

d = (++a && ++b) || ++c;
Run Code Online (Sandbox Code Playgroud)

值为++a-2,其值为true(因为任何非0的值的计算结果为true); 值为++b3,其值为true; 所以这个&&词的价值是真的.因为true || false并且true || true两者都评估true,所以没有必要评估RHS以了解整体结果.(类似的规则&&是,如果第一项计算结果为false,则不需要计算第二项,因为整体表达式必须为false.如果a = -1;在测试之前有,则b不会增加,因为++a它将为零或假因此,其RHS &&未被评估.当然,然后c会增加,因为LHS ||将是假的,并且必须评估RHS以确定总体结果.)

  • 也许他不明白-2和3如何评价为真. (2认同)

Luc*_*ore 9

因为++a && ++b评估到true.

它被称为短路.条件内的表达式从左到右进行评估.如果是这种情况,如果OR对子句中的第一个条件进行求值true,那么第二个条件也无法进行求值,因为已知整个表达式true已经存在.