Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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 - Fatal编程技术网

C “左值必须作为赋值的左操作数”错误-三元运算符

C “左值必须作为赋值的左操作数”错误-三元运算符,c,C,在编译下面的代码时,我得到了赋值的左操作数所需的错误左值 for (i = 1; i < 2 n; i++) { for (((i<= n)?j=1:j=n-i);j<=i&&j>0;((i<=n)?j++:j--)) { printf("*"); } printf("\n"); } 我得到的错误是 pra.c:5:20:错误:赋值的左操作数需要左值 在C语言中,条件运算符的语法和语义不同于C++。你的代码将

在编译下面的代码时,我得到了赋值的左操作数所需的错误左值

for (i = 1; i < 2 n; i++) {
    for (((i<= n)?j=1:j=n-i);j<=i&&j>0;((i<=n)?j++:j--)) {
        printf("*");
    }
    printf("\n");
}
我得到的错误是

pra.c:5:20:错误:赋值的左操作数需要左值
在C语言中,条件运算符的语法和语义不同于C++。你的代码将在C++中编译,因为在C++中表达式

<condition> ? a = b : c = d
将被解析为

<condition> ? (a = b) : (c = d)
(<condition> ? (a = b) : c) = d
在C中,解析的表达式与

<condition> ? (a = b) : (c = d)
(<condition> ? (a = b) : c) = d
这是一个完全不同的故事。C中?:的结果从来都不是左值,这就是后一种解析无法编译的原因

您的代码遭受完全相同的错误

更迂腐的是,正如Johannes在评论中指出的,由于与左值或右值无关的原因,:没有资格充当赋值运算符的左侧。语法直接禁止它。这个表达式根本不应该是可分析的。但是,根据您引用的错误消息判断,编译器对问题的看法不同,或者至少以一种可以被视为轻微误导的方式报告问题

<>这是C语言和C++语言之间的一个比较著名的差异:


在C语言中,条件算子的语法和语义不同于C++。你的代码将在C++中编译,因为在C++中表达式

<condition> ? a = b : c = d
将被解析为

<condition> ? (a = b) : (c = d)
(<condition> ? (a = b) : c) = d
在C中,解析的表达式与

<condition> ? (a = b) : (c = d)
(<condition> ? (a = b) : c) = d
这是一个完全不同的故事。C中?:的结果从来都不是左值,这就是后一种解析无法编译的原因

您的代码遭受完全相同的错误

更迂腐的是,正如Johannes在评论中指出的,由于与左值或右值无关的原因,:没有资格充当赋值运算符的左侧。语法直接禁止它。这个表达式根本不应该是可分析的。但是,根据您引用的错误消息判断,编译器对问题的看法不同,或者至少以一种可以被视为轻微误导的方式报告问题

<>这是C语言和C++语言之间的一个比较著名的差异:


您应该更改iIn C编程,不幸的是,在一行中使用语言中的每个运算符不会得到任何额外的分数。。。改为写可读代码。你应该改变iIn C编程,不幸的是,在一行中使用语言中的每一个运算符,你不会得到任何额外的分数。。。写可读的代码。在我写这篇文章的时候,这个答案是唯一正确的。我总是倾向于忘记这个。我认为C中赋值的左边是一元表达式。那它怎么能符合有条件的支出呢?你能给出一个推导公式吗?a=b:c=d作为c中的赋值表达式?我还看不到,因为?a=b:c根本不是一元表达式。为什么他们故意在语法上把它变成非左值表达式?我认为这个表达式在语法上是错误的,在C中没有对它进行任何解析。@Johannes Schaub-litb:你到底从哪里看到了这个问题?语言语法说条件表达式是逻辑或表达式还是逻辑或表达式?表达式:条件表达式。第二个操作数是表达式,它可能涉及赋值运算符。第三个操作数是逻辑或表达式,如果跟踪整个树,它将被分解为一元表达式,并且不能包含赋值运算符。所以,尾随赋值被留在?:。至于它是一个非左值。。。这只是C的基本属性之一,不同于C++。C语言中绝大多数表达式都产生右值、右值和右值。C中唯一的左值基本上是直接变量名和一元数*的结果。在我写这篇文章时,这个答案是唯一正确的。我总是倾向于忘记这个。我认为C中赋值的左边是一元表达式。那它怎么能符合有条件的支出呢?你能给出一个推导公式吗?a=b:c=d作为c中的赋值表达式?我还看不到,因为?a=b:c根本不是一元表达式。为什么他们故意在语法上把它变成非左值表达式?我认为这个表达式在语法上是错误的,在C中没有对它进行任何解析。@Johannes Schaub-litb:你到底从哪里看到了这个问题?语言语法说条件表达式是逻辑或表达式还是逻辑或表达式?表达式:条件表达式。第二个操作数是表达式,它可能涉及赋值运算符。第三个操作数是逻辑或表达式,如果跟踪整个树,它将被分解为一元表达式,并且不能包含赋值运算符。所以,尾随赋值被留在?:。至于它是一个非左值。。。这只是一个基本的p C的性质,又不同于C++。C语言中绝大多数表达式都产生右值、右值和右值。C中唯一的左值基本上是直接变量名和一元*的结果。