C-算术和优先级

C-Arithmetics and precedence

我正在练习更快地阅读 C 代码,但我很难理解这部分内容:

int a = 7, b = 3, c = 2, d;

d = (b+c >a) || a > c ? a-- : a++;

当我将它输入我的程序并打印出整数 d 时,我得到了 7 的结果。但我真的不明白为什么。有人可以给我解释一下吗?

您正在为 d 分配 a--a++ 的值。这两个表达式的值都是7的值是a);运算符之间的区别在于它们对操作数 (a) 评估表达式后所做的操作:一个然后递增它,另一个递减它。

这就是为什么它们被称为 post-递增和 post-递减运算符的原因。

也许您对 pre-increment 和 pre-decrement 运算符感到困惑,它们是 ++a--a? (另请参阅:Pre increment vs Post increment in array。)

至于三元运算符(x ? y : z)和如何'read'那个,那你可以把它当作if x then y else z; 所以,如果测试的结果(其中有一个逻辑或,这意味着如果 either 比较为真)为真,则为真,则为 d = a--,否则为 d = a++。但是,如前所述,在这种情况下,两者都会给 d 相同的值(尽管它们会对 a 产生不同的影响)。另请注意,三元运算符具有 lower precedence 而不是逻辑 OR 或关系比较,因此您可以阅读 =? 之间的所有内容(另一组) 括号。

表达式解析为

d = ((b+c >a) || a > c) ? a-- : a++;

所以 d 得到 a—a++ 的结果,在这两种情况下都是 7。区别在于计算表达式后 a 的值。

|| 强制从左到右求值,所以 b+c > a 首先求值。由于 b+c5,表达式的结果为假 (0),因此计算 a > c。该表达式的结果为真 (1),因此 (b+c > a) || a > c 的结果为真 (1),这意味着我们将 a— 的结果分配给 d.因此 d 将是 7a 将是 6.

这就是运算符优先级在 C 中的工作方式

第 1 步

d = (3 + 2 > 7) || 7 > 2 ? a-- : a++;

第 2 步

d = false || true ? a-- : a++;

第 3 步

d = true ? a-- : a++;

此处 'a' 的值将更改,但不会在此语句中更改,因此 'a' 的值仍为 7 但是如果你在其他语句中打印 a 它会变成 6.

了解更多关于运算符优先级的信息https://en.cppreference.com/w/c/language/operator_precedence