为什么变量没有增加?
Why isn't the variable being incremented?
增量运算符不工作。
我在学习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
。
i
和 j
递增,因为 i
需要计算。 j
也需要计算,因为 i
不为零。
但是由于这个组合表达式是非零的,||
短路,并且 k++
没有被评估或执行。
另一方面,按位运算符不会短路。他们也不转换为布尔值。如果你想评估所有条件并保持相同的结果,你可以写
m= (!!++i) & (!!++j) | (!!++k);
使用双重否定技巧将整数值转换为布尔值。
或者省去另一条语句并简化为(由 user694733 提供):
++i; ++j; ++k;
m = i && j || k;
&&
和 ||
运算符 短路 - 根据表达式左侧的值,右侧可能根本不评价。
对于表达式a || b
,如果a
不为零,则a || b
的结果为1不管的值的 b
,因此 b
未被评估。对于表达式 a && b
,如果 a
为零,则无论 b
的值如何,a && b
的结果都为零,因此不计算 b
。
在你的例子中,++i && ++j
的结果是非零的,所以 ++k
没有被评估。
增量运算符不工作。
我在学习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
。
i
和 j
递增,因为 i
需要计算。 j
也需要计算,因为 i
不为零。
但是由于这个组合表达式是非零的,||
短路,并且 k++
没有被评估或执行。
另一方面,按位运算符不会短路。他们也不转换为布尔值。如果你想评估所有条件并保持相同的结果,你可以写
m= (!!++i) & (!!++j) | (!!++k);
使用双重否定技巧将整数值转换为布尔值。
或者省去另一条语句并简化为(由 user694733 提供):
++i; ++j; ++k;
m = i && j || k;
&&
和 ||
运算符 短路 - 根据表达式左侧的值,右侧可能根本不评价。
对于表达式a || b
,如果a
不为零,则a || b
的结果为1不管的值的 b
,因此 b
未被评估。对于表达式 a && b
,如果 a
为零,则无论 b
的值如何,a && b
的结果都为零,因此不计算 b
。
在你的例子中,++i && ++j
的结果是非零的,所以 ++k
没有被评估。