2013-05-10 67 views
5
int a = 1, b = 0; 

if(a, b) 
    printf("success\n"); 
else 
    printf("fail\n"); 

if(b, a) 
    printf("success\n"); 
else 
    printf("fail"); 

這是一段cpp的文件,我在Visual Studio 2010的輸出作爲逗號操作,如果條件

fail 
success 

爲什麼這種行爲?你能解釋一下嗎?

+6

你知道,它使用逗號運算符中的條件,但你要問? – 2013-05-10 04:09:41

+0

您可以在第一條語句上添加斷點並使用F10逐行執行程序以自行查看流程。 – vish213 2013-05-10 04:13:14

+0

@DanielFischer我知道逗號在語句中充當序列點,但不是在函數的參數中。可以告訴我它是否是'if'中的序列點?我直覺地感覺**是**,但是我希望你確認。 – 2013-05-10 04:36:37

回答

35

http://en.wikipedia.org/wiki/Comma_operator

在C和C++編程語言中,逗號操作者 (由令牌,表示)是一個二進制運算符,用於評估其 第一個操作數和丟棄結果,然後評估第二個 操作數並返回此值(和類型)。

在你的第一個if

if (a, b) 

a首先是評估和丟棄,b被評爲第二和返回爲0,所以這種情況是假的。

在你的第二個if

if (b, a) 

b首先是評估和丟棄,a被評爲第二和返回1.所以這個條件爲真。

如果有兩個以上的操作數,則返回最後一個表達式。

如果你想兩個條件是真實的,你應該使用&& operator

if (a && b) 
+0

那麼做這些條件有什麼意義呢?有人可以提供一個更好的和有用的例子 – Pars 2016-09-14 06:08:20

+1

@Pars如果你想執行一個引起副作用的操作,但不需要實際的返回值,這會很有用。例如,我在我的一個項目中有這樣的條件:'if(numeric_read(str,&err),!err)'。如果我使用了&&!err而不是'!!err',我將無法讀取0的數字。 – 2016-10-21 21:05:49