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

Prefix operators are not working as expected in C [duplicate]

提问人:Prithvi Reddy 提问时间:2/9/2021 最后编辑:Vlad from MoscowPrithvi Reddy 更新时间:2/9/2021 访问量:86

问:

#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= 0a=0, b= 0, c= 1, d= 0

Screenshot_VS代码

c 后缀表示法 前缀运算符 logical-或 逻辑

评论

0赞 Basile Starynkevitch 2/9/2021
不要那样编码。这样的代码是不可读的,下个月你将难以理解它。考虑使用 GCC 来编译代码,并在代码上使用 clang 静态分析器gcc -Wall -Wextra -g
1赞 Gerhardh 2/9/2021
如果只是纯文本,请不要添加代码或输出的图片。

答:

1赞 Vlad from Moscow 2/9/2021 #1

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

int c = a || --b;

由于操作数不等于 0,因此不计算表达式。a--b

所以变量由 初始化。c1

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

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

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

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

操作数不等于 0(后缀运算符的值是其操作数在递减前的值)。因此,对操作数进行评估。 由于它的值等于 ,则该变量由 初始化。a----b0d0

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

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

因此,在此声明之后将等于 0。ab