C中的后增量和预增量运算符

Ris*_*777 5 c pre-increment post-increment

为什么k没有增加,而i和j在同一个表达式中增加.我也想知道程序的输出是什么.我得到输出为-2 3 1 0

#include <stdio.h>
void main()
{
 int i=-3, j=2, m, k=0;
 m=++i && ++j || ++k;
 printf("%d %d %d %d", i, j, m, k);
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*her 8

逻辑或||短路,以及之后

++i && ++j
Run Code Online (Sandbox Code Playgroud)

确定整个表达式的值,因此||不计算右侧的操作数.

m=++i && ++j || ++k;
Run Code Online (Sandbox Code Playgroud)

括号,m = (++i && ++j) || ++k;因为它的&&优先级高于||.

逻辑运算符的短路意味着,当左侧的评价还没有确定的最终结果,右边的操作数仅被评估,对于||这意味着如果左评估,以0右操作数仅被评估,并且&&,该仅当左边的值评估为非零值时才评估右操作数.

首先++i && ++j评估,首先++i评估.i-3之前的值,所以++i求值为-2,这不是0,因此++j也进行了评估.j具有2之前的值,因此++j求值为3,再次非零,因此++i && ++j求值为1(真).由于该左操作数||不为零,其结果已经确定(为1),并且未评估右操作数,因此k保持不变并m设置为1.


mat*_*975 6

如果||条件左侧的项目评估为真,则由于OR条件已经满足,因此没有评估右侧的点.这就是为什么++k没有被评估