有人能解释一下下面的代码是如何工作的吗

#include <stdio.h>

void main() {
    int a = 2, b = -1, c = 0, d;
    d = a-- || b++ && c++;
    printf("%d%d%d%d", a, b, c, d);
}

我预计该值为&&0,因为我读到&&的优先级高于||,因此应该首先对其求值.但答案似乎是1-101.有人能解释一下为什么吗?我知道短路判断规则,但就是不明白为什么不先执行b++ && c++

推荐答案

运算符优先级指示如何对操作数进行分组,而不是如何计算它们.

由于&&的优先级高于||,因此:

d = a-- || b++ && c++;

与此相同:

d = (a--) || ((b++) && (c++));

现在看一下,我们可以看到||的左操作数是a--,右操作数是b++ && c++.因此,首先计算a--,由于a的值为2,因此此表达式的计算结果为2.这使得||的左侧为真,这意味着不计算右侧,即b++ && c++.因此,因为||的左操作数不是零,所以||运算符1的结果.

因此,a减为1,d被赋值为1,因为这是||运算符的结果,而bc保持不变.

C++相关问答推荐

GCC:try 使用—WError或—pedantic using pragmas

从内联程序集调用Rust函数和调用约定

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

如何解决C中的严格别名?

SDL 2.0-从数组渲染纹理

识别和处理c中整数溢出的最佳方法?

正确的TCP/IP数据包 struct

实现简单字典时C语言中的段错误

使用错误的命令执行程序

链接器脚本和C程序使用相同的头文件,这可能吗?

用于计算位数和的递归C函数

在下面的C程序中,.Ap0是如何解释的?

关于不同C编译器中的__attribute__支持

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

#define X Defined(Y) 是有效的 C/C++ 宏定义吗?

如何在 C 中的 Postgres 函数的表中 for 循环

我该如何处理这个 C 90 代码中的内存泄漏?

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?

在 printf() 格式说明符中使用字段宽度变量