3 回答

TA貢獻1829條經(jīng)驗 獲得超13個贊
C ++中的條件運算符可以返回左值,而C不允許類似的功能。因此,以下內(nèi)容在C ++中是合法的:
(true ? a : b) = 1;
要在C中復制此代碼,您將不得不訴諸if / else或直接處理引用:
*(true ? &a : &b) = 1;
此外,在C ++,?:和=運營商有相同的優(yōu)先級和組從右到左,使得:
(true ? a = 1 : b = 2);
是有效的C ++代碼,但會在C中拋出一個錯誤,并且在最后一個表達式周圍沒有括號:
(true ? a = 1 : (b = 2));

TA貢獻1880條經(jīng)驗 獲得超4個贊
實際的主要區(qū)別在于,在C中,對?:的求值永遠不會像在C ++中那樣導致l值。
它的定義還有其他差異,幾乎沒有實際意義。在C ++中,第一個操作數(shù)轉(zhuǎn)換為布爾值,在C中,它與0進行比較。這類似于C和C ++之間的==,!=等定義上的差異。
C ++中還存在更復雜的規(guī)則,用于根據(jù)第二和第三操作數(shù)的類型推導?:表達式的類型。這反映了C ++中用戶定義的隱式轉(zhuǎn)換的可能性。
示例代碼。有效的C ++; 無效的C.
extern int h(int p, int q);
int g(int x)
{
int a = 3, b = 5;
(x ? a : b) = 7;
return h( a, b );
}
gcc 生成為C時會生成錯誤:“錯誤:賦值中的無效左值”,但編譯為C ++時,代碼將正確編譯。
編輯: 盡管?:不能在C中返回l值,也許令人驚訝的是?:的語法是:
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
這意味著即使(由于“不是l值”規(guī)則)a ? b : c = d解析(a ? b : c) = d也不會導致有效的表達式。
C ++將語法更改為此:
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
盡管在某些情況下允許條件表達式為l值的擴展名在a ? b : c = d沒有語法更改的情況下就有效,但新的語法更改意味著表達式現(xiàn)在有效,但含義不同a ? b : (c = d)。
盡管我沒有任何證據(jù),但是我認為隨著語法的變化不會破壞與現(xiàn)有C代碼的兼容性,因此新語法更有可能使諸如以下的表達式產(chǎn)生更少的驚喜:
make_zero ? z = 0 : z = 1;

TA貢獻1752條經(jīng)驗 獲得超4個贊
C解析的部分不正確。在C語法中,=
運算符的LHS 不能包含非括號?:
運算符。建議的(a ? b : c) = d
解析實際上是不可能的。在C語言中,語法a ? b : c = d
表達根本無法解析。任何解釋它的編譯器都會(a ? b : c) = d
自擔風險。(在試圖統(tǒng)一C和C ++語法的混合C / C ++編譯器中,通常是這種情況。)形式上,這沒有問題,因為仍然會拒絕無效代碼。但是,“不是左值”消息具有誤導性。
- 3 回答
- 0 關(guān)注
- 585 瀏覽
添加回答
舉報