☀️光天化日学C语言☀️(22)- 运算符优先级和结合性 | 有了这张表,再也不怕记不住了
一、前言
本文作者是从 2007 年开始学 C语言 的,不久又接触了C++,基本就是 C/C++ 技术栈写了 14 年的样子,不算精通,但也算差强人意。著有《夜深人静写算法》系列,且承诺会持续更新,直到所有算法都学完。主要专攻 高中 OI 、大学 ACM、 职场 LeetCode 的全领域算法。由于文章中采用 C/C++ 的语法,于是就有不少读者朋友反馈语言层面就被劝退了,更何况是算法。
于是,2021 年 06 月 12 日,《光天化日学C语言》 应运而生。这个系列文章主要服务于高中生、大学生以及职场上想入坑C语言的志同道合之人,希望能给祖国引入更多编程方面的人才,并且让自己的青春不留遗憾!
这一章的主要内容是运算符优先级和结合性。
二、人物简介
- 第一位登场的就是今后会一直教我们C语言的老师 —— 光天。
- 第二位登场的则是今后会和大家一起学习C语言的没什么资质的小白程序猿 —— 化日。
三、运算符简介
- 运算符用于执行程序代码运算,会针对一个、两个或多个操作数来进行运算。例如:1 + 2,其操作数是 1 和 2,而运算符则是 “+”(加号)。
- C语言把除了 控制语句 和 输入输出 以外的几乎所有的基本操作都作为运算符处理,可见一斑。
四、运算符分类
- 将按功能分类,可以分为:后缀运算符、单目运算符、算术运算符、关系运算符、位运算符、逻辑运算符、条件运算符、赋值运算符、逗号运算符。
- 在之前的章节也有介绍了很多运算符,这里简单做个总结:
运算符类型 | 运算符举例 | 参考文章 |
---|---|---|
后缀运算符 | [] 下标运算 |
会在数组章节讲解,待更新 |
单目运算符 | (type) 强制转换 |
光天化日学C语言(12)- 类型转换 |
算术运算符 | + 加号 |
光天化日学C语言(09)- 算术运算符 |
移位运算符 | << 左移 |
光天化日学C语言(18)- 位运算 << 的应用 |
关系运算符 | < 小于 |
光天化日学C语言(10)- 关系运算符 |
双目位运算符 | & 位与 |
光天化日学C语言(14)- 位运算 & 的应用 |
双目逻辑运算符 | && |
光天化日学C语言(11)- 逻辑运算符 |
条件运算符 | ? : |
会在if 语句章节讲解,待更新 |
赋值运算符 | <<= 左移后赋值 |
光天化日学C语言(20)- 赋值运算符与赋值表达式 |
逗号运算符 | , 逗号 |
光天化日学C语言(21)- 逗号运算符 |
五、运算符的优先级和结合性
1、运算符优先级表 (建议收藏)
优先级 | 运算符 | 名称 | 形式 | 举例 |
---|---|---|---|---|
1 | [] |
数组下标 | 数组名[常量表达式] | a[2] |
1 | () |
圆括号 | (表达式) 或 函数名(形参表) | (a+1) |
1 | . |
对象的成员选择 | 对象.成员名 | a.b |
1 | -> |
指针的成员选择 | 指针.成员名 | a->b |
2 | + |
正号 | +表达式 | +5 |
2 | - |
负号 | -表达式 | -5 |
2 | (type) |
强制类型转换 | (数据类型)表达式 | (int)a |
2 | ++ |
自增运算符 | ++变量名 / 变量名++ | ++i |
2 | -- |
自增运算符 | –变量名 / 变量名– | --i |
2 | ! |
逻辑非 | !表达式 | !a[0] |
2 | ~ |
按位取反 | ~表达式 | ~a |
2 | & |
取地址 | &变量名 | &a |
2 | * |
解引用 | *指针变量名 | *a |
2 | sizeof |
取长度 | sizeof(表达式) | sizeof(a) |
3 | * |
乘 | 表达式 * 表达式 | 3 * 5 |
3 | / |
除 | 表达式 / 表达式 | 3 / 5 |
3 | % |
模 | 整型表达式 % 整型非零表达式 | 3 % 5 |
4 | + |
加 | 表达式 + 表达式 | a + b |
4 | - |
减 | 表达式 - 表达式 | a - b |
5 | << |
左移 | 变量<<表达式 | 1<<5 |
5 | >> |
右移 | 变量>>表达式 | x>>1 |
6 | < |
小于 | 表达式<表达式 | 1 < 2 |
6 | <= |
小于等于 | 表达式<=表达式 | 1 <= 2 |
6 | > |
大于 | 表达式>表达式 | 1 > 2 |
6 | >= |
大于等于 | 表达式>=表达式 | 1 >= 2 |
7 | == |
等于 | 表达式==表达式 | 1 == 2 |
7 | != |
不等于 | 表达式!=表达式 | 1 != 2 |
8 | & |
等于 | 表达式&表达式 | 1 & 2 |
9 | ^ |
等于 | 表达式^表达式 | 1 ^ 2 |
10 | | |
等于 | 表达式\表达式 | 1 | 2 |
11 | && |
逻辑与 | 表达式&&表达式 | a && b |
12 | || |
逻辑与 | 表达式|| 表达式 |
a || b |
13 | ?: |
条件运算符 | 表达式1? 表达式2: 表达式3 | a>b?a:b |
14 | = |
赋值 | 变量=表达式 | a = b |
14 | += |
加后赋值 | 变量+=表达式 | a += b |
14 | -= |
减后赋值 | 变量-=表达式 | a -= b |
14 | *= |
乘后赋值 | 变量*=表达式 | a *= b |
14 | /= |
除后赋值 | 变量/=表达式 | a /= b |
14 | %= |
模后赋值 | 变量%=表达式 | a %= b |
14 | >>= |
右移后赋值 | 变量>>=表达式 | a >>= b |
14 | <<= |
左移后赋值 | 变量<<=表达式 | a <<= b |
14 | &= |
位与后赋值 | 变量&=表达式 | a &= b |
14 | ^= |
异或后赋值 | 变量^=表达式 | a ^= b |
14 | |= |
位或后赋值 | 变量|= 表达式 |
a |= b |
15 | , |
逗号运算符 | 表达式1,表达式2,… | a+b,a-b |
2、结合性
结合方向只有 3 个是 从右往左,其余都是 从左往右(比较符合人的直观感受)。
(1)一个是单目运算符;
(2)一个是双目运算符中的 赋值运算符;
(3)一个条件运算符,也就是C语言中唯一的三目运算符。
3、优先级
后缀运算符和单目运算符优先级一般最高,逗号运算符的优先级最低。快速记忆如下:
单目逻辑运算符 > 算术运算符 > 关系运算符 > 双目逻辑运算符 > 赋值运算符
六、运算符的优先级和结合性举例
#include <stdio.h>
int main() {
int a = 1, b = 2, c = 3;
a <<= b <<= c;
printf("%d\n", a );
return 0;
}
【运行结果】65536
【结果答疑】a <<= b <<= c
的计算方式等价于a = (a << (b << c))
,结果为1 << 16
。
#include <stdio.h>
int main() {
int a = 1, b = 2;
printf("%d\n", a > b ? a + b : a - b );
return 0;
}
【运行结果】-1
【结果答疑】条件运算符的优先级较低,低于关系运算符和算术运算符,所以a > b ? a + b : a - b
等价于1 > 2 ? 3 : -1
。
#include <stdio.h>
int main() {
int a = 1;
--a && --a;
printf("%d\n", a);
return 0;
}
【运行结果】0
【结果答疑】这个例子是展示逻辑与运算符&&
从左往右计算过程中,一旦遇到 0 就不再进行运算了,所以--a
实际上只执行了一次。
#include <stdio.h>
int main() {
int x = 0b010000;
printf("%d\n", x | x - 1 );
return 0;
}
【运行结果】31
【结果答疑】这个例子是是将低位连续的零变成一,但是一般这样的写法会报警告,因为编译程序并不知道你的诉求,到底是想先计算 | 还是先计算-
,由于这个问题我们实际要计算的是x | (x - 1)
,并且减法运算符-
优先级高于位或运算符 | ,所以括号是可以省略的。
#include <stdio.h>
int main() {
int a = 0b1010;
int b = 0b0101;
int c = 0b1001;
printf("%d\n", a | b ^ c );
return 0;
}
【运行结果】14
【结果答疑】这个例子表明了异或运算符^
高于位或运算符 | 。
#include <stdio.h>
int main() {
int a = 0b1010;
int b = 0b0110;
printf("%d\n", a & b == 2);
return 0;
}
【运行结果】0
【结果答疑】延续【例题59】继续看,之前a & b
输出的是2
,那为什么加上等于==
判定后,输出结果反而变成0
了呢?原因是因为==
的优先级高于位与&
,所以相当于进行了a & 0
的操作,结果自然就是0了。
通过这一章,我们学会了:
1)运算符的优先级;
2)运算符的结合性;
- 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!
课后习题
📢博客主页:https://blog.csdn.net/WhereIsHeroFrom
📢欢迎各位 👍点赞 ⭐收藏 📝评论,如有错误请留言指正,非常感谢!
📢本文由 英雄哪里出来 原创,转载请注明出处,首发于 🙉 CSDN 🙉
作者的专栏:
👉C语言基础专栏《光天化日学C语言》
👉C语言基础配套试题详解《C语言入门100例》
👉算法进阶专栏《夜深人静写算法》
- 点赞
- 收藏
- 关注作者
评论(0)