2013-02-12 32 views
2

我有一個關於下面的代碼一些問題:左值要求

#include<stdio.h> 
void main() 
{ int a=6,b=2,g; 
    a>b?g=a:g=b; 
} 

,這是沒有任何錯誤正確執行。但如果看得很清楚,應該給出左值需要錯誤。 (a> b?g = a:g)是實際表達式,因爲沒有括號被用作a> b?g = a:(g = b);和值b被分配給在求解第二個賦值(=)運算符左邊的表達式後得到的常數值,這是肯定的錯誤。請幫助這個話題。

+1

什麼編譯器? GCC 4.6.3在這裏,它打破了它應該。 – netcoder 2013-02-12 18:34:00

+0

這給出了t.c:4:12:error:當我編譯它時,作爲賦值左操作數所需的左值(如預期的那樣)。 – 2013-02-12 18:35:34

+0

請注意,此處的表達式與重複項中的表達式相同。注意到'a> b?g = a:g = b'被視爲'((a> b)?g = a:g)= b',並且您實際上不能指定三元運算符的結果因爲它是一個r值,而不是l值。 – 2014-08-24 16:19:47

回答

1

三元運算符本身就是一個右值。它並不完全控制流量,更多的給出了一個條件給出的值。

要修復,請嘗試g = a > b ? a : b

+0

是的,但你錯過了這一點。這並沒有回答這個問題:OP問他爲什麼沒有得到一個錯誤,而不是如何解決他沒有得到的錯誤。 – netcoder 2013-02-12 18:36:38

+0

噢。我剛看到代碼,並認爲它在瀏覽後被破壞了,對不起。 – slugonamission 2013-02-12 18:37:43

0

不要做:

a>b?g=a:g=b; 

試試這個:

g = (a>b)?a:b; 
0

g=部分移至開頭:

g=a>b?a:b; 

會做你想要什麼?

2

The條件運算符的結果從來不是C中的左值。

如果您沒有使用帶條件表達式的語句獲得診斷,那不是C.檢查您是否使用C編譯器(而不是C++編譯器 - 條件運算符的規則在C++中是不同的),並且啓用了ISO模式。

+1

儘管三元操作可以用C++編譯,但是代碼本身不應該用C++編譯,因爲'main'返回'void'。 – netcoder 2013-02-12 18:40:23