💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
【36.1 括号的强制功能。】 C语言中的括号有强制的功能,比如本节内容的强制改变优先级,以及以后将要讲到的数据变量类型的强制转换,指针类型的强制转换,都是要用到括号。括号就是强制,强制就是括号。 【36.2 括号强制改变运算优先级。】 C语言的“加、减、乘、除、与、或、取反、左移、右移”等运算符是有严格优先级顺序的,但是我本人记忆力有限,做项目哪能记住这么多优先级的前后顺序,只是大概明白乘除的优先级比加减的优先级高,其它方面真的记不住那么多,怎么办?为了确保万一,我用到了“括号强制改变优先级”的功能,只要用了括号,就可以不按C语言默认的优先级顺序来出牌,可以人为的改变运算优先级,达到“随心所欲而不逾矩”的美妙境界。 括号的用法跟我们日常的数据运算公式的用法一致,先运行括号里面的运算,再执行其它运算。比如: a=a<<2+5; 这行代码到底是先把变量a左移2位后再加5,还是先2加5等于7再让变量a左移7位?对于像我这样不能熟记C语言运算优先级顺序的人,这条语句很容易让我搞混。但是加上括号就明了,添加括号后如下: a=(a<<2)+5; a=a<<(2+5); 不用多说,加上括号后,上述两行代码传递了清晰的优先级顺序。同理,再看一个例子: c=1+3\*c; 到底是1加3的结果再乘以变量c,还是3乘以变量c的结果再加1?因为我记得乘除法的优先级比加减法的优先级高,所以答案是3乘以变量c的结果再加1。但是对于初学者,为了避免出错,加上括号就显得更加清晰了,添加括号后如下: c=(1+3)\*c; c=1+(3\*c); 加括号后,优先级顺序一目了然。 【36.3 括号会不会带来额外的内存开销?】 有人会问,括号虽好,但是添加括号会不会带来额外的内存开销?答案是:不会。比如: c=1+3\*c; //运算顺序:默认先乘,再加。 c=1+(3\*c); //运算顺序:强制先乘,再加。实现同样的功能,这里的括号也可以省略。 上面两行代码,它们的运算顺序一样的,第二行代码虽然添加了括号,但是不会带来额外的内存开销,这两行代码所占的内存大小是一样的。 括号不是鸡肋,括号应该是保健品,食之有味,又完全无副作用。用了括号可以使程序更加具有可读性,也可以让自己避开优先级顺序的大坑。 【36.4 例程练习和分析。】 现在编写一个程序来验证刚才讲到的主要内容: 程序代码如下: /\*---C语言学习区域的开始。-----------------------------------------------\*/ void main() //主函数 { unsigned char a=0x01; unsigned char b=0x01; unsigned char c=0x02; unsigned char d=0x02; a=(a<<2)+5; //a左移2位后变成4,再加5等于9 b=b<<(2+5); //2加5等于7,b再左移动7位等于128 c=(1+3)\*c; //1加3等于4,再乘以变量c等于8 d=1+(3\*d); //3乘以d等于6,再加1等于7 View(a); //把第1个数a发送到电脑端的串口助手软件上观察。 View(b); //把第2个数b发送到电脑端的串口助手软件上观察。 View(c); //把第3个数c发送到电脑端的串口助手软件上观察。 View(d); //把第4个数d发送到电脑端的串口助手软件上观察。 while(1) { } } /\*---C语言学习区域的结束。-----------------------------------------------\*/ 在电脑串口助手软件上观察到的程序执行现象如下: 开始... 第1个数 十进制:9 十六进制:9 二进制:1001 第2个数 十进制:128 十六进制:80 二进制:10000000 第3个数 十进制:8 十六进制:8 二进制:1000 第4个数 十进制:7 十六进制:7 二进制:111 分析: 通过实验结果,发现在单片机上的实验结果和我们的分析是一致的。 【36.5 如何在单片机上练习本章节C语言程序?】 直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。