C自学之路1——干货!C中运算符优先级的实操!

干货!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.两两操作符搭配,比较优先级;

一条没有感情的分隔带

让我们列个任务清单:

  • 了解+ - * / % 运算符的作用
  • 了解++ – 运算符的作用及其前缀、后缀
  • 操作符之间互相搭配,比较优先级
一条没有感情的分隔带

接下来 正式对各个操作符 进行单独的运算 并对其做分析:

    1. 设置变量,为后续操作提供基础:
#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) + -运算符:
	/*第二步,分别用每个运算符操作变量,并得出结果*/

	// 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
C 中运算符的优先级及结合律

的现在的任务中我们已经完成了:

  • 了解+ - * / % 运算符的作用
  • 了解++ – 运算符的作用及其前缀、后缀
  • 操作符之间互相搭配,比较优先级

等等…这就完了??上边优先级的比较为什么可以这样做你都没说呢?
 
安啦,别担心~ 你要是不知道优先级怎么就得出“相等”、“高于”等,那就 假设 它不相等呗,或高或低随你取,看当运算符a的优先级低于或等于或高于b运算符时,上边运算的式子结果又会有什么不同,你就明白了。

俺也有个自己的小群~都是新手,欢迎大佬来帮忙解答,也欢迎新人来询问问题喔 ~
一起进步,努力!加油!——免费的,什么钱都不要,学习为主!~
计算机行业/专业交流群② - QQ群号:718973810

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值