📅  最后修改于: 2023-12-03 15:13:48.458000             🧑  作者: Mango
C 语言中的运算符是用于执行各种操作的特殊符号,例如,算术运算、关系运算、逻辑运算等。而运算符关联性则是指多个相同类型的操作符出现时,它们在表达式中的执行顺序,也就是优先级和结合性。
在表达式中,运算符的优先级决定了它们的执行顺序,优先级高的运算符先被计算,优先级相同的运算符则按照结合性决定先后顺序。
以下是 C 语言中常用运算符的优先级(从高到低):
| 运算符 | 描述 | | ---------- | ------------------------------------------------------------ | | () | 用于改变运算次序 | | [] | 数组下标 | | -> | 结构体/联合体成员访问 | | ++, -- | 前缀自增/自减、后缀自增/自减 | | +, - | 正数和负数、加法和减法 | | !, ~ | 逻辑非和按位取反 | | * | 指针变量引用 | | & | 取地址符,取变量的地址 | | sizeof() | 取变量/类型大小 | | *,/,% | 乘法,除法,求余 | | +, - | 加法和减法,二元操作符的减法称为取负运算 | | <<, >> | 左移、右移 | | <, <=, >, >= | 关系运算符,比较两个操作数的大小。 | | ==, != | 等于操作符、不等于操作符 | | & | 按位与,对两个操作数的位执行逻辑 AND 运算。 | | ^ | 按位异或,对两个操作数的位执行异或操作 | | | | 按位或,对两个操作数的位执行逻辑 OR 运算。 | | && | 逻辑与,当且仅当两个操作数都非零时结果为真。 | | || | 逻辑或,有一个操作数非零时结果为真。 | | ? : | 三元条件运算符,也称为条件运算符 | | = | 赋值运算符 | | +=, -= | 加等于、减等于 | | *=, /= | 乘等于、除等于 | | %=, <<= | 求余等于、左移等于 | | >>=, &= | 右移等于、按位与等于 | | ^=, |= | 异或等于、按位或等于 |
#include <stdio.h>
int main() {
int a = 2, b = 3, c = 4;
int d = a * b + c; // (a * b) + c
int e = a + b * c; // a + (b * c)
int f = a == b + c; // (a == (b + c))
printf("d = %d\n", d);
printf("e = %d\n", e);
printf("f = %d\n", f);
return 0;
}
在上述代码中,由于乘法运算符的优先级高于加法运算符,所以 d = a * b + c
等价于 (a * b) + c
,结果为 10
;e = a + b * c
等价于 a + (b * c)
,结果为 14
;而等于运算符优先级低于加法运算符,所以 f = a == b + c
等价于 a == (b + c)
,结果为 0
(即假)。
当表达式中出现多个相同优先级的运算符时,它们的执行顺序将由结合性决定,即从左到右(左结合性)或从右到左(右结合性)。
常见的左结合运算符有:赋值运算符 =
、逻辑与运算符 &&
、逻辑或运算符 ||
、逗号运算符 ,
等,例如:a = b = c = d
等价于 a = (b = (c = d))
。
常见的右结合运算符有:幂运算符 ^
、条件运算符 ?:
、函数调用运算符 ()
、指针成员访问运算符 ->
等,例如:a = b ? c : d
等价于 a = (b ? c : d)
。
为了避免由于运算符关联性导致的意外错误,建议在表达式中使用圆括号来明确运算次序,同时也有助于增加程序的可读性。
#include <stdio.h>
int main() {
int a = 2, b = 3, c = 4;
int d = (a * b) + c;
int e = a + (b * c);
int f = a == (b + c);
printf("d = %d\n", d);
printf("e = %d\n", e);
printf("f = %d\n", f);
return 0;
}
在本示例中,将乘法运算和加法运算都添加了圆括号,可以更确切地表示它们的运算顺序,避免了由于运算符关联性导致的错误。