Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 错误:表达式不是可分配的三元运算符_C_Struct_Union_Ternary - Fatal编程技术网

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

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

我有以下代码,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;
不明白为什么

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);