printf i i 逗號運算子

2021-10-23 15:22:50 字數 965 閱讀 9920

#include int main()

//結果是 3 5 5。

這個**說明:

1、int a = (printf("%d ",i++ ),printf("%d ",++i ),i); a是接受的i的賦值,逗號運算子,把最後的賦值給a。

2、在括號裡面的執行順序是順著下來的。

3、如果是下面這樣的話,還能分的清楚a接受到的值是什麼嘛? 

int a = (i++ ,++i ,i);//結果是5,括號內按順序執行
4、如果是下面這樣呢?

printf("%d %d %d\n",i++,++i,i );
首先printf函式是倒著計算,放入棧中,然後pop輸出的,但是放入棧中的是什麼:(以下純屬敘述自己方便記憶,還未驗證,先記下來)

這個++i,在彙編的時候,是直接在記憶體處+1,而i++,則要把i取出來,放到暫存器,然後需要一些操作的時候,就把暫存器中的那個 i 進行操作,而記憶體,默默的+1,只有下一次再從這個位址取 i 的時候,才會發現他已經改變了。

所以這個在放入棧中的時候,有三個引數,分別進行的操作應該是,

1、記下i的位址,輸出的時候解引用 i 位址;

2、直接在i的記憶體那裡 +1,放入記憶體,然後記下i的位址,輸出的時候解引用

3、i++,把暫存器裡面的值放入棧中,輸出該值。

所以結果應該是4 5 5;

然後我們發現乙個規律,所有++i 和 i 都是從算完後解引用i的位址,所有的i++,都是中途記下的那個i。

測試一波:printf(「%d %d %d %d %d」,i++,++i,i++,++i,i);結果應該是 6 7 4 7 7

測試結果:

逗號運算子

在c語言中,多個表示式可以用逗號分開,其中用逗號分開的表示式的值分別結算,但整個表示式的值是最後乙個表示式的值。假設b 2,c 7,d 5,a1 b,c d 3 a2 b,c d 3 對於第一行 有三個表示式,用逗號分開,所以最終的值應該是最後乙個表示式的值,也就是d 3,為8,所以a1 8。對於第...

逗號運算子

c 語言中,逗號 也可以是運算子,稱為逗號運算子 comma operator 逗號運算子可以把兩個以上 包含兩個 的表示式連線成乙個表示式,稱為逗號表示式。其一般形式為 子表示式1,子表示式2,子表示式n 例如 a b,c b,c 逗號運算子的優先順序是所有運算子中級別最低的,通常配合 for 迴...

逗號運算子

逗號運算子是指在c語言中,多個表示式可以用逗號分開,其中用逗號分開的表示式的值分別結算,但整個表示式的值是最後乙個表示式的值。例子 int a1,a2,b 2,c 7,d 5 第1行 a1 b,c d 3 第2行 a2 b,c d 3 第3行 對於給a1賦值的 有三個表示式,用逗號分開,所以最終的值...