ошибка: выражение не присваивается тернарным оператором - PullRequest
3 голосов
/ 27 марта 2019

У меня есть следующий код, и компилятор 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 ]

3 голосов
/ 27 марта 2019
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 голос
/ 27 марта 2019

Ответ прост: из-за приоритет оператора C ,

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 не нуждается в круглых скобках, поскольку ? и : действуют как круглые скобки (особенность троичного оператора).

Еще более простые решения уже упоминались в Камильский ответ ...

...