前缀运算符在 C 中未按预期工作[重复]

问题描述 投票:0回答:1
#include <stdio.h>
int main()
{
    int a = 1;
    int b = 1;
    int c = a || --b;
    int d = a-- && --b;
    printf("a=%d, b= %d, c= %d, d= %d",a,b,c,d);
    return 0;
}

在上面的代码中,我期望输出为

a=0, b= -1, c= 1, d= 0
,但输出为
a=0, b= 0, c= 1, d= 0

Screenshot_VS Code

c postfix-notation prefix-operator logical-or logical-and
1个回答
2
投票

在此声明中用作初始值设定项的表达式中

int c = a || --b;

由于操作数

a
不等于 0,则不计算表达式
--b

因此变量

c
1
初始化。

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

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

在此声明中用作初始值设定项的表达式中

int d = a-- && --b;

操作数

a--
不等于0(后缀运算符的值是其操作数递减之前的值)。因此操作数
--b
被求值。 由于其值等于
0
,因此变量
d
0
初始化。

来自 C 标准(6.5.13 逻辑 AND 运算符)

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

因此,在此声明后

a
b
将等于 0。

© www.soinside.com 2019 - 2024. All rights reserved.