目录
前言
在C语言编程过程中,理解和掌握运算符的优先级至关重要,它直接决定了表达式的计算顺序,从而影响程序的正确性和效率。本文旨在系统地梳理C语言中各类运算符的优先级规则,并通过实例演示来加深读者的理解。
C语言运算符优先级概览
C语言包含多种运算符,按照运算符的优先级从高到低排列如下:
一级优先级:
-
圆括号
()
:括号内的表达式优先级最高,会先于其他运算执行。int a = 10, b = 5; int result = (a + 3) * b; // 先计算(a + 3),结果为15,然后与b相乘得到75 printf("result = %d\n", result); // 输出75
-
下标运算符
[]
:用于访问数组元素。int array[5] = {1, 2, 3, 4, 5}; int index = 2; int value = array[index]; // 访问array[2],结果为3 printf("value = %d\n", value); // 输出3
-
结构体和联合体成员运算符
. (点)
和-> (箭头)
:struct Person { char name[20]; int age; }; struct Person person = {"Alice", 25}; printf("Person's name: %s, age: %d\n", person.name, person.age); // 输出 "Person's name: Alice, age: 25" // 或对于指针 struct Person *ptr = &person; printf("Person's name: %s, age: %d\n", ptr->name, ptr->age); // 输出 "Person's name: Alice, age: 25"
二级优先级:
- 单目运算符:
- 逻辑非
!
:对布尔值进行取反。int flag = 0; if (!flag) { printf("Flag is not set.\n"); }
- 按位取反
~
:对整数所有位进行反转。int num = 5; // 二进制表示为0101 int inv_num = ~num; // 反转后的值为-6(补码表示),二进制为1010
- 自增
++
和自减--
:改变变量本身的值。int x = 5; printf("x before ++x: %d\n", x); // 输出5 printf("x after ++x: %d\n", ++x); // 先自增后输出,输出6
- 正负号
-
(作为单目运算符时):取相反数。int y = 3; int neg_y = -y; // neg_y 的值为 -3
- 类型转换
(类型)
:强制转换数据类型。double d = 3.14; int i = (int)d; // 将double类型转换为int类型,i的值为3
- 取地址运算符
&
:获取变量的内存地址。int z = 7; printf("The address of z: %p\n", &z);
- 长度运算符
sizeof
:返回对象或类型的大小(以字节为单位)。printf("Size of int: %ld\n", sizeof(int));
- 逻辑非
三级优先级:算术运算符
乘法 *
、除法 /
、求余 %
(模运算):
int a = 10, b = 3;
int mult = a * b; // 结果为30
int div = a / b; // 结果为3
int mod = a % b; // 结果为1
printf("mult = %d, div = %d, mod = %d\n", mult, div, mod);
四级优先级:加法 +
和减法 -
int c = 10, d = 5;
int sum = c + d; // 结果为15
int diff = c - d; // 结果为5
printf("sum = %d, diff = %d\n", sum, diff);
五级优先级:位运算符
- 左移
<<
和右移>>
:
int e = 1; // 二进制表示为 00000001
int left_shift = e << 2; // 左移2位,结果为4(二进制表示为 00000100)
int right_shift = e >> 1; // 右移1位,结果为0(二进制表示为 00000000)
printf("left_shift = %d, right_shift = %d\n", left_shift, right_shift);
六级优先级:关系运算符
- 小于
<
、大于>
、小于等于<=
、大于等于>=
:
if (a < b) {
printf("a is less than b.\n");
}
else if (a > b) {
printf("a is greater than b.\n");
}
七级优先级:相等性运算符
- 等于
==
和不等于!=
:
if (a == b) {
printf("a equals to b.\n");
}
else {
printf("a does not equal to b.\n");
}
八级优先级:逻辑运算符
- 逻辑与
&&
:两个条件都为真,则整个表达式为真。
int x = 5, y = 10;
if (x > 0 && y > 0) {
printf("Both x and y are positive.\n");
}
- 逻辑或
||
:两个条件有一个为真,则整个表达式为真。
if (x < 10 || y < 10) {
printf("At least one of x or y is less than 10.\n");
}
九级优先级:条件运算符(三元运算符)
- 条件表达式
?:(三目操作符)
:
int max = (a > b) ? a : b; // 如果a大于b,则max为a,否则为b
printf("Max of a and b is %d\n", max);
十级优先级:赋值运算符
- 简单赋值
=
和复合赋值运算符+=
,-=
,*=
,/=
,%=
,<<=
,>>=
,&=
,^=
,|=
:
a += b; // 相当于 a = a + b
a -= b; // 相当于 a = a - b
// 同理适用于 *=, /=, %= 等
总结
以上就是C语言运算符的优先级概述,希望这些详细的示例能帮助您更好地理解每种运算符的使用以及其优先级。在实际编程中,请务必注意运算符优先级,必要时可以通过添加括号明确表达式的计算顺序。