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 的值分别是 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;
}
首先,让我们看一下操作的顺序。逻辑 AND 运算符&&
的优先级高于逻辑 OR 运算符||
,因此表达式解析如下:
c = a++ || (++b && ++c);
接下来,两者||
都是&&
短路运算符。这意味着首先评估左侧,如果结果可以单独确定,则不评估右侧。
所以a
从值 10 开始。 a++
计算为当前值 (10),同时a
作为副作用递增。这意味着值 10 是 的左侧||
。++b && ++c
因为这是一个非零值,所以整个表达式的值为 1,并且不计算右侧。然后将此结果分配给 1。
所以最终结果a
递增到 11,c
分配 1,因为那是||
表达式的值,并且b
没有改变。
这个表达
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
得到了价值1
并a
增加了。