我做了一些代碼,看起來像這樣:「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
?
我做了一些代碼,看起來像這樣:「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
?
它是comma operator,大多與像foo = (bar1++, f(bar2));
其中遞增bar1
,調用函數f
與bar2
並將其結果設置爲foo
在Ç逗號運算符具有比分配的優先級低副作用的表達式有用。
一般而言e1,e2
(在表達式中)計算左操作數e1
,丟棄其結果,則評估右操作數e2
和給出正確的操作數的值(作爲整個e1,e2
表達式的值)。
Ocaml程序編寫有;
運營商,方案具有begin
,Lisp有progn
類似用途(評估兩個或幾個子表達式的副作用,並給出最後的整個結果)。
在該表達式中,您正在使用,
運算符,該運算符從左到右評估它的操作數並返回最後一個。所以它評估foo = bar1
,然後bar2
。
這裏
foo = bar1;
的更深層次的理解,
int foo = barx, * barp;
這裏,
的操作裝置
int foo = barx;
int *barp;
應該輸出 4. HTTP://en.wikipedia。 org/wiki/Comma_operator「在C和C++編程語言中,逗號運算符( )是一個二元運算符,用於評估其第一個操作數並放棄結果,然後評估第二個操作數並返回此值(和類型)。「但分配的優先級較高,所以先分配丟棄。 –
@PaulTomblin真的,但我認爲'''優先級低於'='。 –
@PaulTomblin它也位於優先級圖的底部(最後我檢查過),所以在OP的問題中,賦值運算符優先考慮優先,而'bar2'的賦值本質上是毫無價值的。 – WhozCraig