C语言 错误:表达式不是可赋值的三元运算符

9jyewag0  于 2023-03-17  发布在  其他
关注(0)|答案(2)|浏览(127)

我有以下代码,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;

不明白为什么?

ckx4rj1h

ckx4rj1h1#

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

inkz8wg9

inkz8wg92#

答案很简单,由于C operator precedence

U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : uart1.oerr = 0;

编译为

(U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : uart1.oerr) = 0;

在C语言中,条件不提供左值,因此这是一个编译错误。
一种解决办法是使用括号:

U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : (uart1.oerr = 0);

请注意,uart1.oerr = 1不需要括号,因为?:的作用类似于括号(三元运算符的特性)。
更简单的解决方案已经在Kamils answer ...

相关问题