2014-03-13 52 views
0
#include<stdio.h> 
int main() 
{ 
    int x=10,y=12; 
    printf("%d",(x,y)); 
    return 0; 
} 

該程序的輸出是12.如何?無法理解C的輸出progaram

+5

你期望它做什麼,爲什麼? – SLaks

+3

你期望它是什麼?爲什麼? (哇 - 奴隸 - 我發誓這不是故意的) –

+0

相關:[在C中使用逗號運算符](http://stackoverflow.com/questions/18666095/using-comma-operator-in-c) – WhozCraig

回答

4

表達你正在評估是:

x,y 

該表達式使用逗號操作符。標準(6.5.17逗號運算符)表示:

逗號操作者的左操作數作爲空隙表達式求值;在它的評估和右操作數的評估之間有一個 序列點。然後評估右邊的 操作數;結果有它的類型和價值。

所以,在你的代碼,x,y計算爲y,其中有12值。

如需更廣泛的討論,我可以參考cppreference.com。雖然,討論C++,這個操作符的討論是C.你的問題特別相關的上下文中有效的本節:

各種逗號分隔的列表,如函數參數列表中的逗號(f(a, b, c)) ,初始化程序列表int a[] = {1,2,3}或初始化語句(int i, j;)不是逗號運算符。如果逗號運算符需要在該上下文中使用,則必須加上括號:f(a, (n++, n+b), c)

而這正是你問題中的情況。如果你這樣寫:

printf("%d", x, y); 

那麼就沒有用逗號,而你會提供一個更參數printf比格式說明。

0

這是因爲首先評估(x,y)。
inside()表達式是x,y它們從左到右計算,因爲Comma運算符的關聯性爲left to right,所以評估(x,y)的最後一個值是y。
閱讀operator precedence and associativity rule和表達是如何在運算符優先級評估,以瞭解這些類型的表達式

+0

你能提供任何鏈接讀取運算符優先級和關聯性規則? –

+0

@ user3416257你只是想要表,然後檢查[this](http://n.ethz.ch/~werdemic/download/week3/C++%20Precedence.html)或[this](http://msdn.microsoft.com /en-us/library/2bxt6kc4.aspx)。也要經過一些表達評估的例子。 – LearningC

4

你使用comma operator機會。

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

這就是說,

printf("%d",(x,y)); 

在功能上等同於

printf("%d", y);