逻辑运算符和赋值运算符之间的求值顺序

问题描述 投票:0回答:2

新手问题

我知道C中运算符的求值顺序和优先级是独立的。但当有多个运算符强制执行评估顺序时,我会感到困惑。

例如:

a = b && c || d;

is parsed like:

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

编译器如何评估这个?

它是否评估 (b && c),(如果需要)评估 d,然后评估从右到左的赋值运算符。

它是否首先评估赋值运算符,然后 && 运算符(如果需要)评估 d

c lazy-evaluation operator-precedence evaluation short-circuiting
2个回答
0
投票

在 C 中的大多数情况下,评估顺序是未指定

在这种情况下,我们有逻辑运算符,并且它们确实有序列点:例如,在开始评估

b
之前,已完全评估
c

赋值运算符没有序列点,因此可以在为其赋值之前或之后计算

a

这就是为什么在此类运算符的两侧修改相同变量是不安全的(例如

*++i = *i
未定义)。


-3
投票

以下链接可以帮助您了解算子进动。

此外,等于 (=) 在表达式的最后进行操作,并且 && 具有更高的进动,因此将首先求值,然后 ||操作员。

https://www.geeksforgeeks.org/operator-precedence-and-associativity-in-c/

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