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

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了光天化日学C语言(22)- 运算符优先级和结合性 | 有了这张表,再也不怕记不住了相关的知识,希望对你有一定的参考价值。

🙉饭不食,水不饮,题必须刷🙉

还不会C语言,和我一起打卡!
🌞《光天化日学C语言》🌞

LeetCode 太难?上简单题!
🧡《C语言入门100例》🧡

LeetCode 太简单?大神盘他!
🌌《夜深人静写算法》🌌

一、前言

  本文作者是从 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
2sizeof取长度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: 表达式3a>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例》
  👉算法进阶专栏《夜深人静写算法》

以上是关于光天化日学C语言(22)- 运算符优先级和结合性 | 有了这张表,再也不怕记不住了的主要内容,如果未能解决你的问题,请参考以下文章

C语言中结合性自右向左怎么理解

C语言运算的优先级别和结合方向表是啥的?

[c语言]运算符的优先级与结合性

c语言运算符优先级,结合性(左/右结合详解)

编程语言中优先级与结合性

算术运算符和算术表达式(优先级,结合性等)