2011-12-23 43 views
9
int a = 1; 
int b = (1,2,3); 
cout << a+b << endl; // this prints 4 
  1. (1,2,3)某種在C結構++(一些原始類型列表中,也許?)
  2. 爲什麼b賦值3?編譯器是否簡單地從列表中獲取最後一個值?
+1

該代碼背後沒有邏輯。這是一個老師會彌補測試你對逗號運算符的理解。適當時使用[作業]。 – 2011-12-23 20:54:15

+0

或者是一個錯字錯誤。即(1,2,3)不是代碼的作者所期望的。 – ddyer 2011-12-25 18:19:58

+0

[C:中逗號操作符\','是幹什麼的](http:// stackoverflow。com/questions/52550/what-do-comma-operator-do-in-c) – 2015-07-09 13:04:30

回答

8

是的,就是這樣:編譯器取最後一個值。這是逗號運算符,它從左向右評估其操作數並返回最右邊的操作數。它也解決了從左到右。爲什麼有人會這樣寫代碼,我不知道:)

所以int b = (1, 2, 3)相當於int b = 3。它不是任何類型的原始列表,並且逗號運算符,主要用於在一個表達式的上下文中評估多個命令,例如a += 5, b += 4, c += 3, d += 2, e += 1, f

+4

一個很好用的(排序)在for(;; ++ x,++ y)裏面 – 2011-12-23 20:52:18

+0

@LokiAstari:對。 (我剛剛意識到 - 通過「爲什麼有人會這樣寫代碼,我不知道」我指的是'(1,2,3)',這是無用的,在其他情況下逗號運算符沒問題':)') – Ryan 2011-12-23 20:55:38

+0

我能想到的唯一可能的(不一定是好的)理由是將一堆操作串在一起,你不關心每個操作的結果。 [示例](http://ideone.com/MuwxQ)。 *編輯:*和洛基的將是另一個。 – FakeRainBrigand 2011-12-23 20:56:20

6

(1,2,3)是一個使用逗號運算符的兩個實例的表達式。逗號運算符評估其左操作數,然後有一個序列點,然後評估其右操作數。逗號運算符的值是評估右操作數的結果,評估左操作數的結果將被丟棄。

int b = (1,2,3); 

,因此,等同於:

int b = 3; 

大多數編譯器將發出警告這樣的使用逗號操作數的,因爲這裏只有永遠一個點使用逗號操作者如果左手錶達有一些副作用。

1

這是逗號運算符,其格式爲expr, expr。評估第一個表達式並丟棄結果,評估第二個表達式並返回結果。

((1, 2), 3) => 
(2, 3) => 
3 
4

第二行使用逗號操作:

在你的情況爲線進行評價。像

a, b 

表達式計算兩個ab並返回b

在這種情況下,第二行被解析,如:

int b = ((1, 2), 3); 

所以(1, 2)進行評估(以2)然後扔掉,並且最終結果是簡單地3.

-3

它可能用來be b = foo(1,2,3),但是foo被意外刪除。 C不抱怨這種垃圾「這是一個功能」。

+0

我認爲那些正在翻閱這個答案的人缺少重要的一點。沒有人會寫這個代碼。如果提問者試圖理解這段代碼,他必須明白,作者實際上並不是想要的。 – ddyer 2011-12-25 18:15:50