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

问题描述 投票:3回答:2

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

不明白为什么?

c struct union ternary
2个回答
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,该值将隐式转换为非零值的10为零。


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

© www.soinside.com 2019 - 2024. All rights reserved.