我有以下代码,MPLABX XC8编译器给出此错误:
错误:表达式不可赋值
U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : uart1.oerr = 0;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
下面是相关的代码部分:
typedef union {
struct {
bool ferr : 1; // FERIF Framing Error
bool aerr : 1; // ABDOVF Error
bool oerr : 1; // RXFOIF Error
bool ready : 1; // Data Ready to be read
uint8_t reserved : 4;
};
uint8_t status;
}uart1_status_t;
static volatile uart1_status_t uart1;
U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : uart1.oerr = 0;
当我使用时,同样的事情不会给予错误
if (U1ERRIRbits.RXFOIF)
uart1.oerr = 1;
else
uart1.oerr = 0;
不明白为什么?
2条答案
按热度按时间ckx4rj1h1#
解释为:
它试图将
0
赋值给...?如果你想使用这样的构造,你需要大括号:或者更好:
或:
或:
或者只是:
作为
typeof(uart1.oerr) == bool
,对于非零值,该值将隐式转换为1
,对于零值,将隐式转换为0
。inkz8wg92#
答案很简单,由于C operator precedence,
编译为
在C语言中,条件不提供左值,因此这是一个编译错误。
一种解决办法是使用括号:
请注意,
uart1.oerr = 1
不需要括号,因为?
和:
的作用类似于括号(三元运算符的特性)。更简单的解决方案已经在Kamils answer ...