【C语言深入】陷阱:一个优先级导致的BUG

  版权信息:
● 本博客使用CC 3.0协议,转载请保留该信息。
● 原文作者: 戴晓天 @ 云飞机器人实验室
● 原文地址: 【C语言深入】陷阱:一个优先级导致的BUG

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

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;

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

%d bloggers like this: