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)
逻辑或||短路,以及之后
++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.