gpt4 book ai didi

c - 运算符与 c 中的 'postfix decrement' 和 'logical AND' 运算符的关联性

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:05 25 4
gpt4 key购买 nike

免责声明:我不是这样编码的,我只是想了解c语言是如何工作的!!!!

输出为12。

这个表达式 (a-- == 10 && a-- == 9) 从左到右求值,a 在 a-- == 10 但对于 a-- == 9,a 是 9。

1) 是否有关于何时进行增量后评估的明确规则?从这个例子来看,它似乎在 && 之前但在 == 之后进行评估。是因为&&逻辑运算符让a-- == 10成为一个完整的表达式,所以a在执行后更新了?

2) 同样对于c/c++,某些运算符如前缀递减从右到左出现所以a == --a首先将a递减到9然后比较9 == 9。是否有为什么 c/c++ 是这样设计的?我知道对于 Java,情况恰恰相反(从左到右求值)。

#include <stdio.h>

int main() {
int a = 10;
if (a-- == 10 && a-- == 9)
printf("1");
a = 10;
if (a == --a)
printf("2");
return 0;
}

最佳答案

逻辑 && 运算符在第一个和第二个操作数的计算之间包含一个序列点。部分原因是作为左侧一部分的任何副作用(例如由 -- 运算符执行的副作用)在评估右侧之前就已完成。

这在 C standard 的第 6.5.13p4 节中有详细说明关于逻辑 AND 运算符:

Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; if the second operand is evaluated, there is a sequence point between the evaluations of the first and second operands. If the first operand compares equal to 0, the second operand is not evaluated.

对于这个表达式:

(a-- == 10 && a-- == 9)

a (10) 的当前值首先与 10 比较是否相等。这是真的,所以右侧被评估,但不是在递减 a 的副作用之前 这是在左侧完成的。然后,将 a 的当前值(现在为 9)与 9 进行比较。这也是 true,因此整个表达式的计算结果为 true。在执行下一条语句之前,在右侧完成的递减 a 的副作用已经完成。

但是这个表达式:

if (a == --a)

涉及在没有序列点的相同表达式中读取和写入a。这会调用 undefined behavior .

关于c - 运算符与 c 中的 'postfix decrement' 和 'logical AND' 运算符的关联性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52747724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com