前缀运算符在 C 中没有按预期工作

问题描述

#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,d= 0

Screenshot_VS Code

解决方法

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

int c = a || --b;

因为操作数 a 不等于 0,所以不计算表达式 --b

因此变量 c1 初始化。

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

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

在 tjis 声明中用作初始化器的表达式中

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

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

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...