0

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;
}
4

2 回答 2

2

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

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

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

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

所以最终结果a递增到 11,c分配 1,因为那是||表达式的值,并且b没有改变。

于 2020-05-10T16:03:38.630 回答
1

这个表达

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

可以等效地重写为

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

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

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

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

3 || 如果任一操作数比较不等于 0,则运算符应产生 1;否则,它产生 0。结果具有 int 类型。

4 不同于按位 | 运算符,|| 运算符保证从左到右的评估;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较不等于 0,则不计算第二个操作数

所以c得到了价值1a增加了。

于 2020-05-10T16:00:52.653 回答