在 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
不变.
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
不变.