2016-08-15 55 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中沒有任何解析方法。 –

相關問題