2013-08-29 26 views
0

我做了一些代碼,看起來像這樣:「foo = bar1,bar2」是做什麼用的?

int foo, bar1 = 4, bar2 = 7; 

foo = bar1, bar2; // Look at this expression. 

printf("%d", foo); 

使用GCC編譯它,與-Wall-Wextra。 輸出爲4

除了醜陋,這種表達方式是不確定的行爲,或者是foo總是設置爲bar1

+0

應該輸出 4. HTTP://en.wikipedia。 org/wiki/Comma_o​​perator「在C和C++編程語言中,逗號運算符( )是一個二元運算符,用於評估其第一個操作數並放棄結果,然後評估第二個操作數並返回此值(和類型)。「但分配的優先級較高,所以先分配丟棄。 –

+3

@PaulTomblin真的,但我認爲'''優先級低於'='。 –

+0

@PaulTomblin它也位於優先級圖的底部(最後我檢查過),所以在OP的問題中,賦值運算符優先考慮優先,而'bar2'的賦值本質上是毫無價值的。 – WhozCraig

回答

1

它是comma operator,大多與像foo = (bar1++, f(bar2));其中遞增bar1,調用函數fbar2並將其結果設置爲foo

Ç逗號運算符具有比分配的優先級低副作用的表達式有用。

一般而言e1,e2(在表達式中)計算左操作數e1丟棄其結果,則評估右操作數e2和給出正確的操作數的值(作爲整個e1,e2表達式的值)。

Ocaml程序編寫有;運營商,方案具有begin,Lisp有progn類似用途(評估兩個或幾個子表達式的副作用,並給出最後的整個結果)。

1

在該表達式中,您正在使用,運算符,該運算符從左到右評估它的操作數並返回最後一個。所以它評估foo = bar1,然後bar2

0

這裏

foo = bar1; 

的更深層次的理解,

int foo = barx, * barp; 

這裏,的操作裝置

int foo = barx; 
int *barp; 
相關問題