在 C 中对整数使用逻辑运算符

Using logical operators on integers in C

Logical OR and Logical AND operator on integers in C

你能解释一下为什么a,b,c的值分别是11,10,1吗? 为什么b的值还是10?

#include <stdio.h>
int main()
{
    int a,b,c;
    a=b=c=10;
    c = a++ || ++b && ++c;
    printf("%d %d %d",a,b,c);
    return 0;
}

这个表达式

c = a++ || ++b && ++c;

可以等价改写成

c = ( a++ ) || ( ++b && ++c );

由于表达式 a++ 不等于 0,因此不计算第二个子表达式 ( ++b && ++c )

逻辑运算符的值|| && 为 1(真)或 0。

来自 C 标准(6.5.14 逻辑或运算符)

3 The || operator shall yield 1 if either of its operands compare unequal to 0; otherwise, it yields 0. The result has type int.

4 Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares unequal to 0, the second operand is not evaluated.

因此 c 得到值 1 并且 a 增加了。

首先,让我们看一下操作顺序。逻辑 AND 运算符 && 的优先级高于逻辑 OR 运算符 ||,因此表达式解析如下:

c = a++ || (++b && ++c);

接下来,||&&都是短路运算符。这意味着首先评估左侧,如果结果可以单独确定,则不评估右侧。

所以 a 从值 10 开始。a++ 评估当前值 (10),同时递增 a 作为副作用。这意味着值 10 是 || 的左侧。因为这是一个非零值,所以整个表达式的值为 1,并且不计算右侧 ++b && ++c。然后这个结果赋值给1.

所以最终结果是a递增为11,c赋值1因为那是||表达式的值,而b不变.