C 语言中的运算符优先级
C 语言中,一个表达式可能包含多个不同类型的运算符。C 编译器会根据运算符的优先级和结合性来计算其值。
运算符的优先级决定了它们在表达式中的计算顺序。优先级较高的运算符会先计算。
例如,请看这个表达式 -
x = 7 + 3 * 2;
这里,乘法运算符 "*" 的优先级高于加法运算符 "+"。因此,先执行乘法 3*2,然后再将其与 7 相加,结果为 "x = 13"。
下表列出了 C 语言中运算符的优先级顺序。优先级最高的运算符位于表格顶部,优先级最低的运算符位于表格底部。
类别 | 运算符 | 结合律 |
---|---|---|
后缀运算符 | () [] -> . ++ - - | 从左到右 |
一元运算符 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 |
乘法 | * / % | 从左到右 |
加法 | + - | 从左到右 |
移位 | << >> | 从左到右 |
关系 | < <= > >= | 从左到右 |
相等 | == != | 从左到右 |
按位与 | & | 从左到右 |
按位异或 | ^ | 从左到右 |
按位或 | | | 从左到右 |
逻辑与 | && | 从左到右 |
逻辑或 | || | 从左到右 |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 |
逗号 | , | 从左到右 |
在表达式中,优先级较高的运算符将先求值。
运算符结合性
在 C 语言中,运算符的结合性是指表达式在程序中的求值方向(从左到右或从右到左)。当表达式中出现两个优先级相同的运算符时,即为运算符结合性。
以下示例为 -
15 / 5 * 2
"/"(除法)和"*"(乘法)运算符具有相同的优先级,因此求值的顺序将由结合性决定。
根据上表,乘法运算符的结合性是从左到右的。因此,该表达式的计算结果为 −
(15 / 5) * 2
其计算结果为 −
3 * 2 = 6
示例 1
在下面的代码中,乘法和除法运算符的优先级高于加法运算符。
乘法运算符的从左到右结合律导致"b"与"c"相乘,再除以"e"。结果加起来等于"a"的值。
#include <stdio.h> int main(){ int a = 20; int b = 10; int c = 15; int d = 5; int e; e = a + b * c / d; printf("e : %d " , e ); return 0; }
输出
运行此代码时,将产生以下输出 -
e: 50
示例 2
我们可以使用括号来改变求值的顺序。括号 () 在所有 C 运算符中具有最高优先级。
#include <stdio.h> int main(){ int a = 20; int b = 10; int c = 15; int d = 5; int e; e = (a + b) * c / d; printf("e: %d ", e); return 0; }
输出
运行代码并检查其输出 −
e: 90
在此表达式中,首先将括号中的 a 与 b 相加。将结果乘以 c,然后除以 d。
示例 3
在计算 e 的表达式中,我们将 a+b 放在一个括号中,将 c/d 放在另一个括号中,并将两者的结果相乘。
#include <stdio.h> int main(){ int a = 20; int b = 10; int c = 15; int d = 5; int e; e = (a + b) * (c / d); printf("e: %d ", e ); return 0; }
输出
运行此代码后,您将获得以下输出 -
e: 90
后置/前缀递增/递减运算符的优先级
"++"和"− −"运算符分别充当递增和递减运算符。它们本质上是一元运算符,可以用作变量的前缀或后缀。
单独使用这些运算符时,以前缀或后缀的方式使用这些运算符具有相同的效果。换句话说,"a++"与"++a"具有相同的效果。但是,当这些"++"或"− −"运算符与其他运算符一起出现在表达式中时,它们的行为会有所不同。
后置递增和递减运算符的优先级高于前缀递增和递减运算符。
示例
以下示例展示了如何在 C 程序中使用递增和递减运算符 -
#include <stdio.h> int main(){ int x = 5, y = 5, z; printf("x: %d ", x); z = x++; printf("Postfix increment: x: %d z: %d ", x, z); z = ++y; printf("Prefix increment. y: %d z: %d ", y ,z); return 0; }
输出
运行代码并检查其输出 −
x: 5 Postfix increment: x: 6 z: 5 Prefix increment. y: 6 z: 6
逻辑运算符具有从左到右的结合性。但是,编译器会计算确定表达式结果所需的最少操作数。因此,表达式的某些操作数可能不会被计算。
例如,请看以下表达式 -
x > 50 && y > 50
此处,仅当第一个表达式计算结果为 True 时,才会计算第二个操作数"y > 50"。