打印
[应用相关]

C语言不可轻视的优先级

[复制链接]
2352|52
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

C语言有32个关键字,却有34个运算符。要记住所有运算符的优先级是困难的。稍不注意,你的代码逻辑和实际执行就会有很大出入。

比如下面将BCD码转换为十六进制数的代码:

 result=(uTimeValue>>4)*10+uTimeValue&0x0F;

这里uTimeValue存放的BCD码,想要转换成16进制数据,实际运行发现,如果uTimeValue的值为0x23,按照我设定的逻辑,result的值应该是0x17,但运算结果却是0x07。经过种种排查后,才发现’+’的优先级是大于’&’的,相当于(uTimeValue>>4)*10+uTimeValue与0x0F位与,结果自然与逻辑不符。符合逻辑的代码应该是:

 result=(uTimeValue>>4)*10+(uTimeValue&0x0F);

不合理的#define会加重优先级问题,让问题变得更加隐蔽。



编译器在编译后将宏带入,原代码语句变为:

if(IO0PIN&(1<<11) ==(1<<11))
{
     //其它代码   
}

运算符'=='的优先级是大于'&'的,代码IO0PIN&(1<<11) ==(1<<11))等效为IO0PIN&0x00000001:判断端口P0.0是否为高电平,这与原意相差甚远。因此,使用宏定义的时候,最好将被定义的内容用括号括起来。

按照常规方式使用时,可能引起误会的运算符还有很多,如下表所示。C语言的运算符当然不会只止步于数目繁多!



有一个简便方法可以避免优先级问题:不清楚的优先级就加上”()”,但这样至少有会带来两个问题:
过多的括号影响代码的可读性,包括自己和以后的维护人员
别人的代码不一定用括号来解决优先级问题,但你总要读别人的代码
无论如何,在嵌入式编程方面,该掌握的基础知识,偷巧不得。建议花一些时间,将优先级顺序以及容易出错的优先级运算符理清几遍。

使用特权

评论回复
沙发
而服务器人| | 2024-8-14 15:30 | 只看该作者
是否有推荐的工具或方法来检查代码中的这些优先级问题

使用特权

评论回复
板凳
狄克爱老虎油| | 2024-8-17 23:33 | 只看该作者
拿不准就加括号呗

使用特权

评论回复
地板
kqh11a| | 2024-8-28 12:18 | 只看该作者
这意味着在没有明确括号的情况下,C 编译器会首先处理乘法和位与操作的优先级差异。

使用特权

评论回复
5
花间一壶酒sd| | 2024-8-31 22:02 | 只看该作者
在C语言中,运算符的优先级确实会影响代码的执行结果。

使用特权

评论回复
6
C语言有32个关键字,却有34个运算符。要记住所有运算符的优先级是困难的

使用特权

评论回复
7
jtracy3| | 2024-9-9 09:43 | 只看该作者
C语言有一张操作符优先级表,列出了所有操作符的优先级。

使用特权

评论回复
8
geraldbetty| | 2024-9-9 11:49 | 只看该作者
不要过分依赖运算符的默认优先级,特别是在复杂的表达式中,使用括号可以提高代码的可读性和可维护性。

使用特权

评论回复
9
sfd123| | 2024-9-9 12:19 | 只看该作者
我都是 加括号

使用特权

评论回复
10
51xlf| | 2024-9-9 14:19 | 只看该作者
为了避免因运算符优先级导致的错误,建议在复杂的表达式中使用括号明确指定运算顺序。

使用特权

评论回复
11
nomomy| | 2024-9-9 15:18 | 只看该作者
简单赋值=及复合赋值如+=、-=、*=、/=等。
赋值运算符的优先级是所有运算符中最低的。

使用特权

评论回复
12
janewood| | 2024-9-9 20:23 | 只看该作者
要清楚地知道各类操作符的优先级高低。例如,乘法和除法运算符(*、/、%)的优先级高于加法和减法运算符(+、-)。而在逻辑运算符中,逻辑非(!)的优先级高于逻辑与(&&)和逻辑或(||)。
记住括号(())具有最高的优先级,可以用来强制改变表达式的计算顺序。在复杂表达式中,合理使用括号可以使代码的意图更加清晰,避免因优先级问题导致的错误。

使用特权

评论回复
13
maudlu| | 2024-9-9 23:26 | 只看该作者
C语言定义了一组运算符的优先级,从高到低排列。例如,乘法和除法的优先级高于加法和减法。

使用特权

评论回复
14
juliestephen| | 2024-9-10 02:28 | 只看该作者
虽然 C 语言的优先级规则是确定的,但在复杂表达式中过度依赖默认优先级可能会导致代码难以理解和维护。例如,表达式 “a * b + c /d - e && f || g = h”,由于优先级的存在,其计算顺序可能并不直观,容易出现错误。

使用特权

评论回复
15
lihuami| | 2024-9-10 05:30 | 只看该作者
包括逻辑非!、按位取反~、自增++、自减--等。
这些运算符的优先级高于算术运算符和关系运算符,但低于括号运算符。

使用特权

评论回复
16
lzmm| | 2024-9-10 16:59 | 只看该作者
圆括号()具有最高优先级,可用于改变计算顺序。

使用特权

评论回复
17
kmzuaz| | 2024-9-10 18:42 | 只看该作者
C语言中的运算符按照一定的优先级顺序进行运算。例如,括号 () 具有最高的优先级,其次是单目运算符(如 ++、--、!、~),然后是算术运算符(乘法 *、除法 /、求余 % 优先于加法 +、减法 -),以此类推。了解这些优先级可以帮助避免逻辑错误。

使用特权

评论回复
18
hudi008| | 2024-9-10 20:32 | 只看该作者
括号 () 的优先级最高,用于改变默认的运算顺序。
单目运算符(如 !、~、++、--、*(指针解引用)、&(取地址)等)的优先级高于双目运算符。
算术运算符(+、-、*、/、%)的优先级高于关系运算符(>、<、==、!=、>=、<=)。
关系运算符的优先级高于逻辑运算符(&&、||)。
赋值运算符(=、+=、-= 等)的优先级最低。

使用特权

评论回复
19
abotomson| | 2024-9-10 22:17 | 只看该作者
逗号运算符的优先级最低,其结合方向也是从左到右。

使用特权

评论回复
20
belindagraham| | 2024-9-11 09:01 | 只看该作者
用圆括号可以强制某些部分的运算先于其他部分进行,提高代码可读性。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

248

主题

1917

帖子

3

粉丝