我有以下代码,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;
不明白为什么吗?
答案 0 :(得分:3)
U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : uart1.oerr = 0;
被解释为:
(U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : uart1.oerr) = 0;
哪个试图将0
分配给...?如果要使用这种构造,则需要大括号:
U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : (uart1.oerr = 0);
或更佳:
uart1.oerr = U1ERRIRbits.RXFOIF ? 1 : 0;
或:
uart1.oerr = !!U1ERRIRbits.RXFOIF;
或:
uart1.oerr = (bool)U1ERRIRbits.RXFOIF;
或者实际上只是:
uart1.oerr = U1ERRIRbits.RXFOIF;
与typeof(uart1.oerr) == bool
一样,对于非零值,该值将隐式转换为1
;对于零,则将其隐式转换为0
。
答案 1 :(得分:1)
答案很简单,由于C operator precedence,
U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : uart1.oerr = 0;
编译为
(U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : uart1.oerr) = 0;
在C中,条件不提供LValue。因此,这是编译器错误。
一种解决方案是使用括号:
U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : (uart1.oerr = 0);
请注意,uart1.oerr = 1
不需要括号,因为?
和:
就像括号一样(三元运算符的特长)。
Kamils answer中已经提到了更简单的解决方案...