为什么变量不增加?

时间:2019-02-13 14:10:09

标签: c logical-operators

增量运算符不起作用。

我正在学习C语言表达。我还尝试了对变量使用增量运算符(前缀和后缀)的不同组合,但输出结果是相同的。

int i=-3, j=2 ,k=0,m;

m=++i&&++j||++k;

printf("%d%d%d%d\n",i,j,k,m);  

我希望输出为-2311,但结果为-2301

2 个答案:

答案 0 :(得分:4)

ij递增,因为需要评估i。还需要评估j,因为i非零。

但是由于此组合表达式非零,所以||短路,并且k++不被评估或执行。

另一方面,按位运算符不会短路。它们也不会转换为布尔值。如果您想评估所有条件并保持相同的结果,则可以编写

m= (!!++i) & (!!++j) | (!!++k);

使用双重否定技巧将整数值转换为布尔值。

或者保留另一条语句并简化为(由user694733提供):

++i; ++j; ++k;
m = i && j || k;

答案 1 :(得分:1)

&&||运算符短路-根据表达式左侧的值,可能不会在右侧计算右侧全部。

对于表达式a || b,如果a不为零,则a || b的结果为{{1}的值的1 },因此不会评估b。对于表达式b,如果a && b为零,则a的结果为零,而与a && b的值无关,因此不评估b

在您的情况下,b的结果为非零,因此不评估++i && ++j