干货!C中运算符优先级的实操!
这是我的第一个博客,在我初中一次意外接触到编程后,便一发不可收拾,然而业精于勤荒于嬉,贪玩的我到最后一无所有,被这残酷的现实压垮;就又准备抄老底了嘿嘿嘿嘿。
我会从现在开始慢慢记录我学习的每一步…哦也慢不得,时间不等人呀!开始吧。
这是小菜鸟的第一次博客尝试,个人也还在学习的路上,过程中用到的方法都是很基础的方法,若有任何不对的地方,还请各位大佬指正呀~~ 谢谢啦 ~
-------------------一条没有感情的分割线-------------------
今天主要探讨C语言学习过程中一直没搞明白的运算符优先级,而今天探讨的主要方式也是通过实操完成。
A:学习的结构层次
既然要探讨运算符的优先级,因此先从运算符说起;
在了解了运算符的基础上,再探讨运算符的优先级。
B:再探运算符
1.运算符:
运算符不用想那么复杂,说白了功能就是和数学里边的加减乘除符号类似,是电脑进行基本算术运算的工具。
(这里只是为了说明优先级,所以讨论范围限定在加减乘除、取模等几个运算符中)
2.运算符有哪些呢?
经查阅资料,在《C Primer Plus》附录B上有介绍,如下:
首先看看分类:
分类 | 运算符 |
---|---|
算术运算符 | + - * / % ++ – – |
关系运算符 | < <= == >= > != |
赋值运算符 | = += -= 8= /= %= &= |
逻辑运算符 | ! && || |
(指针)运算符 | & * |
符号运算符 | - + |
结构和联合运算符 | . -> |
按位运算符 | ~ & | ^ << >> |
混合运算符 | sizeof _Alignof (C11支持) (类型名) ,(逗号运算符) |
一堆运算符,要全讨论的话这篇文章就成了一个章节了,所以在这里我们只讨论算术运算符的优先级;
我们将算术运算符单独拿出来:
(优先级1最高)
运算符 | 结合律 | 优先级 |
---|---|---|
++ (后缀) – – (后缀) | 从左往右 | 1 |
++ (前缀) – – (前缀) | 从右往左 | 2 |
* / % | 从左往右 | 3 |
+ – | 从左往右 | 4 |
可能到这儿,很多人就开始头疼了:
这个从左往右、后缀前缀到底是个什么意思?
优先级又如何体现?
别急,实践出真知!让我们通过实例一步一步了解!
对于有一定C基础或者编程基础的童鞋来说,这些运算符应该是都不陌生的,因此,具体的定义就不说了,不明白的可以百度,也可以去看书,咱直接进入实操!
C.实操环节:
为方便观察结果,我们将具体的操作分为以下几个步骤:
1.设置任意类型变量a,b和数组c,d (这里我们假设都为int) 并为其分别赋上不等的值,用以了解其各自的作用(针对很新很新的新手);
2.分别对每个运算符在变量上进行单独的操作并 printf 结果;
3.两两操作符搭配,比较优先级;
一条没有感情的分隔带 |
---|
让我们列个任务清单:
- 了解+ - * / % 运算符的作用
- 了解++ – 运算符的作用及其前缀、后缀
- 操作符之间互相搭配,比较优先级
一条没有感情的分隔带 |
---|
接下来 正式对各个操作符 进行单独的运算 并对其做分析:
-
- 设置变量,为后续操作提供基础:
#include <stdio.h>
int main(void)
{
/* 第一步,设置int类型的4个变量,分别是a,b,c[],和d[],并新建一个
result变量来存储最后的运算结果 */
int a = 4, b = 5;
int c[5] = { 1,2,3,6,7 };
int d[5] = { 8,9,10,11,12 };
int result;
return 0;
}
-
- 分别用每个运算符操作变量,并得出结果:
- (1) + -运算符:
/*第二步,分别用每个运算符操作变量,并得出结果*/
// 1. + - 号运算符:
result = a + b;
printf("a + b = %d \n", result);
result = c[1] + d[2];
printf("c[1] + d[2] = %d \n", result);
result = a - b;
printf("a - b = %d \n", result);
result = c[1] - d[2];
printf("c[1] - d[2] = %d \n", result);
return 0;
}
运行结果:
结果分析:+号是一个二元运算符,将左右两边的同类型值相加并返回该值;
- (2)* / % 运算符:
result = a * b;
printf("a * b = %d \n", result);
result = c[1] * d[1];
printf("c[1] * d[1] = %d\n", result);
result = c[3] / d[4];
printf("c[3] / d[4] = %d \n", result);
result = a / b;
printf("a / b = %d\n", result);
result = a % b;
printf("a %c b = %d \n", '\045',result);
result = c[4] % d[4];
printf("c[5] %c d[5] = %d\n", '\045',result);
return 0;
运行结果:
结果分析:* / % 都是二元运算符,将左右两边的同类型值做乘、除、模运算后返回其各自的值;
- (3) ++ - - 运算符:
//++ -- 运算符
/* ①前缀形式 */
printf("++和--前缀运算:\n");
a = 3;
printf("++a = %d \n", ++a);
a = 6;
printf("--a = %d \n", --a);
c[2] = 5;
printf("++c[2] = %d \n", ++c[2]);
c[2] = 5;
printf("--c[2] = %d \n", ++c[2]);
/* ②后缀模式 */
printf("++和--后缀运算:\n");
a = 3;
printf("now a = %d \n", a);
printf("now a++ = %d \n", a++);
printf("now a(after a++) = %d \n", a);
a = 6;
printf("now a = %d \n", a);
printf("now a-- = %d \n", a--);
printf("now a(after a--) = %d \n", a);
c[2] = 5;
printf("now c[2] = %d \n", c[2]);
printf("now c[2]++ = %d \n", c[2]++);
printf("now c[2] (after c[2]++) = %d \n", c[2]);
c[2] = 5;
printf("now c[2] = %d \n", c[2]);
printf("now c[2]-- = %d \n", c[2]--);
printf("now c[2] (after c[2]--) = %d \n", c[2]);
return 0;
运行结果:
结果分析:
1.前后缀关系:
通过结果可以看到,前缀实际上就是在…之前发生,后缀实际上就是在…之后发生;
如果是前缀就是在printf之前先递增(减)变量自身;如果是后缀就是在printf之后再递增(减)变量自身;这一点通过上边的实际结果就可以看出;
至此,清单中的项目我们已经完成了两个:(当然你要全部点上也行哈哈哈哈)
- 了解+ - * / % 运算符的作用
- 了解++ – 运算符的作用及其前缀、后缀
- 操作符之间互相搭配,比较优先级
重头戏:操作符之间的互相搭配——优先级探讨 |
---|
// + - * / % ++ -- 的优先级探讨:
puts("① + 与 - 的优先级,初始 a = 3 ; b = 4");
/* ① + 与 - 的优先级,初始 a = 3 ; b = 4 */
a = 3; b = 4;
result = a + b - 1;
printf("a+b-1 = %d \n", result);
result = a - b + 1;
printf("a-b+1 = %d \n", result);
puts("");
puts("② + 与 * 的优先级,初始 a = 3 ; b = 4");
/* ② + 与 * 的优先级,初始 a = 3 ; b = 4 */
a = 3; b = 4;
result = a + b * 3;
printf("a+b*3 = %d \n", result);
result = a * 3 + b;
printf("a*3+b = %d \n", result);
puts("");
puts("③ + 与 / 的优先级,初始 a = 4 ; b = 8");
/* ③ + 与 / 的优先级,初始 a = 4 ; b = 8 */
a = 4; b = 8;
result = a + b / 4;
printf("a+b/4 = %d \n", result);
result = a / 2 + b;
printf("a/2+b = %d \n", result);
puts("");
puts("④ * 与 / 的优先级,初始 a = 2 ; b = 4");
/* ④ * 与 / 的优先级,初始 a = 2 ; b = 4 */
a = 2; b = 4;
result = a * 2 / b ;
printf("a * 2 / b = %d \n", result);
result = a / 2 * b ;
printf("a / 2 * b = %d \n", result);
puts("");
puts("⑤ + 与 ++(后缀)的优先级,初始 a = 4 ; b = 6");
/* ⑤ + 与 ++(后缀)的优先级,初始 a = 4 ; b = 6 */
a = 4; b = 6;
printf("now a = %d , b = %d \n", a, b);
result = a++ + b;
printf("a++ +b = %d \n", result);
printf("now a = %d and b = %d \n", a, b);
result = a + b++;
printf("a + b++ = %d \n", result);
printf("now a = %d and now b = %d \n", a, b);
puts("");
puts("⑥ + 与 ++(前缀)的优先级,初始 a = 4 ; b = 6");
/* ⑥ + 与 ++(前缀)的优先级,初始 a = 4 ; b = 6 */
a = 4; b = 6;
printf("now a = %d , b = %d \n", a, b);
result = ++a + b;
printf("++a +b = %d \m", result);
printf("now a = %d and b = %d \n", a, b);
result = a + ++b;
printf("a + ++b = %d \n", result);
printf("now a = %d and now b = %d \n", a, b);
return 0;
运行结果:
结果分析:
1.通过①例,能得出 + 和 - 的优先级相同;运算顺序是按照书写顺序进行;
2.通过②例,能得出 * 的优先级比 + 高;又因为 + 与 - 的优先级,相同,因此 的优先级比 + 和 - 都高,具体的验证方案请大家自己去跑程序了~;
3.通过③例,能得出/ 的优先级比 + 高;又因为 + 与 - 的优先级,相同,因此/ 的优先级比 + 和 - 都高,同样具体验证请大家自己跑程序~
4.通过④例,能得出/ 与的优先级相同;
通过①-④的实际操作,可以得出如下结论: * 与/ 的优先级是比 + 与 - 的优先级高的;
通过⑤⑥例,我们可以分析出以下几点:
(1)++ 为前缀时,其优先级比 + 要高,都是先进行 ++ 运算后再进行 + 运算;
(2)++ 为后缀时,其优先级比 + 要低,先进行 + 运算后再进行 ++ 运算;
同样的方法,可以依次求得各个运算符之间的优先级关系;这里就不过多赘述了,如果你看到这儿了,相信你已经知道如何去进行其他运算符的比较了~ 自己动手试试吧 ~
下面给出不同运算符的优先级关系如下图:——图源 《 C Primer Plus 第六版 》.附录B
的现在的任务中我们已经完成了:
- 了解+ - * / % 运算符的作用
- 了解++ – 运算符的作用及其前缀、后缀
- 操作符之间互相搭配,比较优先级
等等…这就完了??上边优先级的比较为什么可以这样做你都没说呢?
安啦,别担心~ 你要是不知道优先级怎么就得出“相等”、“高于”等,那就 假设 它不相等呗,或高或低随你取,看当运算符a的优先级低于或等于或高于b运算符时,上边运算的式子结果又会有什么不同,你就明白了。
俺也有个自己的小群~都是新手,欢迎大佬来帮忙解答,也欢迎新人来询问问题喔 ~
一起进步,努力!加油!——免费的,什么钱都不要,学习为主!~
计算机行业/专业交流群② - QQ群号:718973810