逻辑运算符在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 | | 如果expr1expr2(或两者)有一个非零值,则expr2的值为1

  • 的值i7to增加,8因为j的值被分配给i但同样的方式为什么j即使j = k?我期待一个值也没有增加

输出

1
8, 9, 9

回答

从 C 标准(强调我的):

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

上述行为通常称为操作员短路。

在您的示例中,由于(i = j)不为零,因此不会评估第二个操作数。


以上是逻辑运算符在C的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>