虽然我在工作中已经非常注意优先级的问题,可还是不小心犯了一个优先级导致的错误:
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
>> 关于我们: 关于云飞实验室
>> 支持我们: 帮助我们可持续发展