2014-06-20 58 views
1
#include<stdio.h> 
#include<stdlib.h> 
int main() { 

    int x = 5; 
    int y = 0; 
    x++, y = x*x; 
    printf("x is %d\n", x); 
    printf("y is %d\n", y); 

} 

問: 爲什麼上面的代碼的輸出是:的逗號操作符用法在C

x is 6 
y is 36 

代替

x is 6 
y is 25 

推理: 我想應該是後者,因爲賦值運算符比逗號更高的優先級,因此首先分配到y要發生它設置爲25然後x應該進行評估,並設置爲6

+0

請參見[什麼逗號操作符' ,'在C做?](http://stackoverflow.com/a/18444099/1708801) –

+0

爲什麼寫代碼,你不確定它會做什麼? –

+1

是什麼讓你認爲優先順序與評估順序有關?他們是完全不同的東西。 –

回答

3

優先級與程序的語法樹有關,而與程序的執行方式無關。什麼那些優先級別正在做的是

x++, (y = x*x) /* this is how your programs gets parsed */ 

(x++ , y) = x*x /* this is NOT how it is parsed */ 

程序被解析後之間的多義性,從左至右所以x++被之前運行的表達式的結果爲,狀態下執行規則y = x*x。最後,,;非常相似,不同之處在於您可以將它放在需要表達式而不是語句的地方。

3

逗號運算符的LHS必須在逗號運算符的RHS之前進行評估;兩者之間有一個完整的序列點。

因此,必須對x++進行評估,並且必須在考慮表達式的y = x * x部分或評估其任何部分之前發生所有副作用(增量)。

1

優先順序不決定評估順序。 =結合高度比,這樣的表達是:

(x++), (y = x*x;) 

逗號是從左向右計算的,幷包括一個序列點,使你的表情是類似於:

x++ ; y = x*x ;