错误:表达式不可分配的三元运算符

时间:2019-03-27 12:50:40

标签: c struct union ternary

我有以下代码,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 个答案:

答案 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中已经提到了更简单的解决方案...