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
爲什麼這種行爲?你能解釋一下嗎?
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
爲什麼這種行爲?你能解釋一下嗎?
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)
那麼做這些條件有什麼意義呢?有人可以提供一個更好的和有用的例子 – Pars 2016-09-14 06:08:20
@Pars如果你想執行一個引起副作用的操作,但不需要實際的返回值,這會很有用。例如,我在我的一個項目中有這樣的條件:'if(numeric_read(str,&err),!err)'。如果我使用了&&!err而不是'!!err',我將無法讀取0的數字。 – 2016-10-21 21:05:49
你知道,它使用逗號運算符中的條件,但你要問? – 2013-05-10 04:09:41
您可以在第一條語句上添加斷點並使用F10逐行執行程序以自行查看流程。 – vish213 2013-05-10 04:13:14
@DanielFischer我知道逗號在語句中充當序列點,但不是在函數的參數中。可以告訴我它是否是'if'中的序列點?我直覺地感覺**是**,但是我希望你確認。 – 2013-05-10 04:36:37