新手问题
我知道C中运算符的求值顺序和优先级是独立的。但当有多个运算符强制执行评估顺序时,我会感到困惑。
例如:
a = b && c || d;
is parsed like:
a = ((b && c) || d);
编译器如何评估这个?
它是否评估 (b && c),(如果需要)评估 d,然后评估从右到左的赋值运算符。
或
它是否首先评估赋值运算符,然后 && 运算符(如果需要)评估 d
在 C 中的大多数情况下,评估顺序是未指定。
在这种情况下,我们有逻辑运算符,并且它们确实有序列点:例如,在开始评估
b
之前,已完全评估 c
。
赋值运算符没有序列点,因此可以在为其赋值之前或之后计算
a
。
这就是为什么在此类运算符的两侧修改相同变量是不安全的(例如
*++i = *i
未定义)。
以下链接可以帮助您了解算子进动。
此外,等于 (=) 在表达式的最后进行操作,并且 && 具有更高的进动,因此将首先求值,然后 ||操作员。
https://www.geeksforgeeks.org/operator-precedence-and-associativity-in-c/