☀️光天化日学C语言☀️(22)- 运算符优先级和结合性 | 有了这张表,再也不怕记不住了

举报
英雄哪里出来 发表于 2021/08/17 07:05:10 2021/08/17
【摘要】 有了这张表,再也不怕记不住了

一、前言

  本文作者是从 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、优先级

后缀运算符和单目运算符优先级一般最高,逗号运算符的优先级最低。快速记忆如下:

单目逻辑运算符 > 算术运算符 > 关系运算符 > 双目逻辑运算符 > 赋值运算符

六、运算符的优先级和结合性举例


🧡例题1🧡
#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


🧡例题2🧡
#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


🧡例题3🧡
#include <stdio.h>
int main() {
    int a = 1;
    --a && --a;
    printf("%d\n", a); 
    return 0;
}

【运行结果】0
【结果答疑】这个例子是展示逻辑与运算符&&从左往右计算过程中,一旦遇到 0 就不再进行运算了,所以--a实际上只执行了一次。


🧡例题4🧡
#include <stdio.h>
int main() { 
    int x = 0b010000; 
    printf("%d\n", x | x - 1 ); 
    return 0;
}

【运行结果】31
【结果答疑】这个例子是是将低位连续的零变成一,但是一般这样的写法会报警告,因为编译程序并不知道你的诉求,到底是想先计算 | 还是先计算 -,由于这个问题我们实际要计算的是x | (x - 1),并且减法运算符-优先级高于位或运算符 | ,所以括号是可以省略的。


🧡例题5🧡
#include <stdio.h>
int main() {
    int a = 0b1010;
    int b = 0b0101;
    int c = 0b1001;
    printf("%d\n", a | b ^ c );
    return 0;
}

【运行结果】14
【结果答疑】这个例子表明了异或运算符^高于位或运算符 | 。


🧡例题6🧡
#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例》
  👉算法进阶专栏《夜深人静写算法》

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。