虽然我在工作中已经非常注意优先级的问题,可还是不小心犯了一个优先级导致的错误:

while (USART1->SR & USART_SR_RXNE == 0);

这句话的本意是等待SR寄存器的某位变为1才继续往下执行,而实际上,因为”==”的优先级大于”&”,这句话等同于:

while (USART1->SR & (USART_SR_RXNE == 0));
//而 (USART_SR_RXNE == 0) 一直不成立,从而这句话等价于:
while (USART1->SR & 0);

即 while (0); 所以每次执行到该句话时,不管当前SR寄存器的内容是什么,都会直接跳过while。为了防止出现优先级错误,正确的写法应该是:

while ((USART1->SR & USART_SR_RXNE) == 0);

与此类似的错误还有:

nValue = nByte << 3 + 8;

这句语句的本意是将nByte左移3位后的值加上8赋给nValue,然而实际上因为算术运算符”+”的优先级大于以为运算符”<<“,于是这句话变为:

nValue = nByte << (3 + 8);

// 即
nValue = nByte << 11;

可见优先级关系在这里导致了完全错误的结果。


>> 本文章版权归作者所有,如需转载请联系作者授权许可。
>> 原文来自: 云飞机器人实验室
>> 原文地址: C语言 | 陷阱:一个优先级导致的BUG


发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据