逻辑运算符在C
我正在努力理解以下代码的行为:
#include <stdio.h>
int main(void)
{
int i;
int j;
int k;
i = 7;
j = 8;
k = 9;
printf("%dn", (i = j) || (j = k));
printf("%d, %d, %dn", i, j, k);
return (0);
}
输出:
1
8, 8, 9
题:
-
我知道expr1 | | 如果expr1或expr2(或两者)有一个非零值,则expr2的值为1。
-
的值
i从7to增加,8因为j的值被分配给i但同样的方式为什么j即使j = k?我期待一个值也没有增加
输出
1
8, 9, 9
回答
从 C 标准(强调我的):
不同于按位 | 运算符 || 运算符保证从左到右的评估;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较不等于 0,则不计算第二个操作数。
上述行为通常称为操作员短路。
在您的示例中,由于(i = j)不为零,因此不会评估第二个操作数。