从单片机基础到程序框架(全集 2019pdf版).pdf - 第151页
第三十六节:括号的强制功能---改变运算优先级。 【36.1 括号的强制功能。 】 C 语言中的括 号有强制的 功能, 比如本节内 容的强制改 变优先级,以 及以后将 要讲到的 数据变量类 型的 强制转换, 指针类型的强 制转换,都是 要用到 括号。括号就 是强制,强制 就是括号。 【36.2 括号强制改变运算优先级。 】 C 语言的“加、 减、乘、 除、与、 或、取反、 左移、右移 ”等运算符是 有严 格优先级顺序 的,但是我 本 人…

十进制:1
十六进制:1
二进制:1
第 3 个数
十进制:18
十六进制:12
二进制:10010
第 4 个数
十进制:52
十六进制:34
二进制:110100
第 5 个数
十进制:4
十六进制:4
二进制:100
第 6 个数
十进制:2
十六进制:2
二进制:10
分析:
通过实验结果,发现在单片机上的计算结果和我们的分析是一致的。
【35.6 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第三十六节:括号的强制功能---改变运算优先级。
【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