2016-08-15 54 views
0

在编译时在下面,我得到的错误代码“需要左值作为转让的左操作数”“需要左值作为转让的左操作数”错误 - 三元操作

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

其实我是想打印仅使用两个模式下面的for循环

* 
** 
*** 
**** 
***** 
**** 
*** 
** 
* 

,我得到的错误是

pra.c:5:20: error: lvalue required as left operand of assignment for(((i<=5)?j=1:j=i);j<=i&&j>0;((i<=5)?j++:j--)){ ^
有人可以帮助我吗?

+0

你应该改变'(第(i <= 5)J = 1:【J = i)'to'(j =((i <= 5)?1:i))' –

+1

在C语言编程中,您很遗憾没有得到任何奖励分数。 。改为编写可读代码。 – Lundin

回答

3

在C语言中,条件运算符的语法和语义与C++不同。您的代码将编译的C++中,由于在C++中的表达

<condition> ? a = b : c = d 

将被解析为

<condition> ? (a = b) : (c = d) 

在C相同的表达被解析为

(<condition> ? (a = b) : c) = d 

这是一个完全不同的故事。 C中的?:的结果永远不是左值,这就是后者解析不能编译的原因。

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

约翰内斯在评论中指出,?:由于与左值或右值无关的原因而没有资格作为赋值运算符的左手边。语法只是立即禁止它。该表达式根本不应该被解析。但是,根据您引用的错误消息判断,编译器会以不同的方式来看问题(或者至少以可能被视为“轻度误导”的方式来报告问题)。

这是C和C++语言之间的相当知名区别之一:

Errors using ternary operator in c

Conditional operator differences between C and C++

+0

在我写这篇文章的时候,这个答案是唯一正确的答案。 – Bathsheba

+0

我总是会忘记这一点。我认为C中赋值的左边是“一元表达式”。那么它如何适合那里的有条件表现呢? –

+0

你可以给一个推导'? a = b:c = d'作为C中的赋值表达式?我看不到它,因为'? a = b:c'根本不是一个一元表达式。为什么他们故意将它作为一种非语言表达?我认为这个表达只是语法上的错误,在C中没有任何解析方法。 –

相关问题