计算优先级和顺序
C 运算符优先级和结合性影响操作数的分组和计算表达式中的。 ,仅当具有更高或较低优先级的其他运算符存在,运算符优先级是有意义的。 使用优先级最高的运算符的表达式首先计算。 优先级可以通过将的字符串还介绍 “”。具有较高优先级的运算符被称为有更严格的绑定。
下表总结了优先级和结合性 (操作数计算) 的顺序 C 运算符,列出它们按照从最高优先级的顺序到最低。 有几个运算符显示在一起,这些相同的优先级和结合性根据其进行计算。 运算符在表中各节介绍从 后缀运算符启动。 本节其余部分提供有关优先级和结合性的常规信息。
C 运算符优先级和结合性
Symbol1 |
操作的类型 |
结合性 |
---|---|---|
[ ] ( ) .– AMP_GT 后缀++和后缀-- |
表达式 |
从左到右 |
标题 ++ 和标题 -- sizeof *、 +、 – ~! |
一元 |
从右到左 |
转换 |
一元 |
从右到左 |
* / % |
乘法 |
从左到右 |
+ – |
加法 |
从左到右 |
AMP_LTAMP_LT AMP_GTAMP_GT |
按位右移 |
从左到右 |
AMP_LT AMP_GT AMP_LT= AMP_GT= |
相关 |
从左到右 |
== != |
相等 |
从左到右 |
& |
按位与 |
从左到右 |
^ |
按位或独占 |
从左到右 |
| |
包含按位或 |
从左到右 |
&& |
逻辑和 |
从左到右 |
|| |
逻辑或 |
从左到右 |
? : |
条件表达式 |
从右到左 |
= *= /= %= += – = AMP_LTAMP_LT= AMP_GTAMP_GT= = ^= |= |
简单和复合 assignment2 |
从右到左 |
, |
顺序计算 |
从左到右 |
1. 运算符按降序优先级列表。 如果几个运算符出现在同一行或在组中,它们相等优先级。
2. 所有简单和复合赋值运算符相同优先级。
表达式可以包含相同优先级的几个运算符。 当若干种运算符出现在表达式的同一级别,计算基于运算符的结合性从右向左或从左至右,执行。 计算的方向不影响包括多个乘法表达式的结果 (*),加号 (+) 或二进制按位 ( |^) 运算符在同一级别。 操作序列未定义的由语言。 ,如果编译器无法保证一致的结果,编译器可以安全地评估此类表达式任意顺序。
仅顺序计算 (,),逻辑与 (),逻辑或 (||),条件表达式 (?:),并请功可以调用运算符组合序列点并确保计算特定顺序它们的操作数。 函数调用运算符是遵循函数标识符的一组括号。 顺序计算运算符 (,) 以确保从左至右计算其操作数。 (逗号运算符函数调用不同于顺序计算运算符相同的说明,而不提供任何此类保证。)有关更多信息,请参见 序列点。
逻辑运算符从左至右还确保其操作数的计算。 但是,它们计算必要的操作数的最小数目确定表达式的结果。 这称为 “短路计算”。 因此,该表达式的一些操作数不能进行计算。 例如,在表达式
x && y++
第二个操作数对象, y++,计算,仅当 x 为 true (非零)。 因此, y 不增加,如果 x 中的错误 (0)。
示例
下面的列表显示编译器如何自动将几个示例:
表达式 |
自动绑定 |
---|---|
a & b || c |
(a & b) || c |
a = b || c |
a = (b || c) |
q && r || s-- |
(q && r) || s–– |
在第一个表达式,按位与运算符 (&) 的具有更高优先级的逻辑或运算符 (||), a & b 这样窗体逻辑或运算的第一个操作数。
在第二个表达式,逻辑或运算符 (||) 比简单赋值运算符 (=) 具有更高优先级的,因此, b || c 分组为该分配的右侧的操作数。 注意该值赋给 a 为 0 或 1。
第三个表达式显示可能会导致意外的结果的一个正确形成的表达式。 逻辑 " 与 " 运算符 (&&) 的具有更高优先级的逻辑或运算符 (||),因此, q && r 分组作为操作数。 因为逻辑运算符从左至右确保操作数的计算, q && r 在 s––之前进行计算。 但是,因此,如果 q && r 计算为非零值, s–– 不会计算,因此, s 不会减少。 如果不会递减 s 程序中导致问题, s–– 应显示为表达式的第一个操作数,或在单独的操作应递减 s 。
下面的表达式是非法的并生成一个诊断消息在编译时:
表达式非法 |
默认分组 |
---|---|
p == 0 ? p += 1: p += 2 |
( p == 0 ? p += 1 : p ) += 2 |
此表达式,相等运算符 (==) 具有最高优先级,因此, p == 0 分组作为操作数。 条件表达式运算符 (? :) 具有最 NeXT 高的优先级。 其第一个操作数是 p == 0,因此,其第二个操作数是 p += 1。 但是,条件表达式运算符的最后一个操作数视为 p 而不是 p += 2,,因为 p 此显示时间比执行对复合赋值运算符紧密地进行绑定条件表达式运算符。 ,因为 += 2 没有一个左操作数,语法错误。 您应使用括号防止此类型以及生成可读性更好的代码错误。 例如,可以使用括号如下所示更正并阐明了前面的示例:
( p == 0 ) ? ( p += 1 ) : ( p += 2 )