C 错误:表达式不是可分配的三元运算符
我有以下代码,MPLABX XC8编译器给出了此错误: 错误:表达式不可赋值C 错误:表达式不是可分配的三元运算符,c,struct,union,ternary,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
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;
不明白为什么
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;
由于typeof(uart1.oerr)=bool
,对于非零值,该值将隐式转换为1
,对于零值,该值将隐式转换为0
。答案很简单,因为
汇编为
(U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : uart1.oerr) = 0;
在C语言中,条件不提供左值。因此,这是一个编译器错误
一种解决方案是使用括号:
U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : (uart1.oerr = 0);
请注意,uart1.oerr=1
不需要括号,因为?
和:
的作用类似于括号(三元运算符的一种特长)
甚至更简单的解决方案已经在…中提到过,uart1.oerr=U1ERRIRbits.RXFOIF如何?1:0;代码>改为?尝试改为U1ERRIRbits.RXFOIF?uart1.oerr=1:(uart1.oerr=0)
。条件约束比赋值强@谢谢你!看起来好多了@Scheff谢谢你的回答!:)这是什么意思?“当我使用时,相同的东西不会给出错误”这根本不是相同的东西!三元运算符(与任何运算符一样)用作表达式的一部分。表达式不会创建左值。在另一个版本中,您有单独的语句为左值赋值。另一个一般规则:在实际需要之前,避免使用?:
。这一点也不常见。
U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : uart1.oerr = 0;
(U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : uart1.oerr) = 0;
U1ERRIRbits.RXFOIF ? uart1.oerr = 1 : (uart1.oerr = 0);