printf函式輸出順序的理解

2021-09-25 13:51:52 字數 3437 閱讀 4572

注意:筆者並未研究printf的實現原始碼,僅從呼叫結果分析該問題,如有理解不當之處請指正。

最近使用printf()函式碰到了乙個有趣的現象。

int j=0;

printf(

"[%x][%x][%x][%x]\n"

,j++

,j++

,j++

,j++);

//result:[3

][2]

[1][

0]

原本以為輸出結果是[0] [1] [2] [3],沒想到結果是:[3] [2] [1] [0]。而,

printf(

"[%x] [%x] [%x] [%x]\n"

, j+

+, j=j+

1, j+

+, j++)

;//[3

][4]

[1][

0]

竟然是[3] [4] [1] [0]。

因此寫了一些測試**,

int \j=0

; printf(

"[%x] [%x] [%x] [%x]\n",/

*row1*

/j++

, j+

+, j+

+, j++)

;//[3

][2]

[1][

0]j=0

; printf(

"[%x] [%x] [%x] [%x]\n",/

*row2*

/j, j+

+, j+

+, j++)

;//[3

][2]

[1][

0]j=0

; printf(

"[%x] [%x] [%x] [%x]\n",/

*row3*

/j++

, j+

+, j, j++)

;//[2

][1]

[3][

0]j=0

; printf(

"[%x] [%x] [%x] [%x]\n",/

*row4*

/j++

, j=j+

1, j+

+, j++)

;//[3

][4]

[1][

0]j=0

; printf(

"[%x] [%x] [%x] [%x]\n",/

*row5*

/j++,+

+j, j+

+, j++)

;//[3

][4]

[1][

0]j=0

; printf(

"[%x] [%x] [%x] [%x]\n",/

*row6*

/j++,+

+j, j++,

++j);//

[3][

4][1

][4]

j=0; printf(

"[%x] [%x] [%x] [%x]\n",/

*row7*/+

+j,+

+j,+

+j,+

+j);//[

4][4

][4]

[4]

由row1~row3可見,

printf()函式從右至左先計算了各個表示式的值,再從左至右進行格式化輸出。

由row1,row5,row7可見,

j++表示式返回遞增前的值,可能是printf建立了臨時變數(猜測"a=j; j=j+1; return a;"),此處儲存了臨時變數a;

++j表示式返回了遞增後的j,此處儲存了j;

row1:

=> j++, j++, j++, j++

=> 從右至左計算,返回臨時變數tmp

=> step3(t***=3, j=4), step2(tmp2=2, j=3), step1(tmp1=1, j=2), step0(tmp0=0,j=1);

=> 從左至右輸出(t***, tmp2, tmp1, tmp0)。

=> [3] [2] [1] [0]

row5:

=> j++, ++j, j++, j++

=> 從右至左計算,j++返回臨時變數tmp,++j返回j

=> step3(t***=3, j=4), step2(j=3), step1(tmp1=1, j=2), step0(tmp0=0, j=1);

=> 從左至右輸出(t***, j, tmp1, tmp0)。

=> [3] [4] [1] [0]

row7:

=> ++j, ++j, ++j, ++j

=> 從右至左計算,++j返回j

=> step3(j=4), step2(j=3), step1(j=2), step0(j=1);

=> 從左至右輸出(j, j, j, j)。

=> [4] [4] [4] [4]

同理,row4的step2處返回了j,最終輸出4。

那麼,

int arr[5]

=;int*p = arr;j=0

; printf(

"[%x][%x][%x][%x]\n"

, p[j++]

, p[j++]

, p[j++]

, p[j++]

);j=0

; printf(

"[%x][%x][%x][%x]\n"

, p[

++j]

, p[

++j]

, p[

++j]

, p[

++j]);

j=0; printf(

"[%x][%x][%x][%x]\n"

, p[j++]

, p[

++j]

, p[j++]

, p[

++j]);

p = arr;j=

0; printf(

"[%x][%x][%x][%x]\n"

,*p++,

*p++

,*p++,

*p++);

p = arr;j=

0; printf(

"[%x][%x][%x][%x]\n",*

++p,*+

+p,*

++p,*+

+p);

p = arr;j=

0; printf(

"[%x][%x][%x][%x]\n",*

++p,

*p++,*

++p,

*p++

);

這段**的結果會是多少呢?

printf函式輸出

在筆試的時候,問了這樣一道選擇題 int main 有這樣幾個選項 a.1,2,3 b.1,2 c 1 d.編譯錯誤 答案是 b 當時雖然回答正確,但是總覺得對printf的輸出很是模糊,仔細查閱了相關資料發現還是需要注意的!先宣告下,以下編譯都是在vc 6.0中執行的結果 先來看下面一段 int ...

函式printf的運算順序

printf的運算順序是從右到左,還是從左到右,還是其他的。要看具體的編譯器而定,比如下面的乙個例子 int i 5 printf d,d n i,i printf d,d n i,i printf d,d n i,i 在vc中的執行結果是 7,68,7 9,9 說明執行順序是從右到左的。而在sou...

格式輸出函式printf

1 格式輸出函式的一般形式 函式原型 int printf char format argument,函式功能 按規定格式向輸出裝置 一般為顯示器 輸出資料,並返回實際輸出的字元數,若出錯,則返回負數。它使用的一般形式為 printf 格式控制字串 輸出項列表 語句中 輸出項列表 列出要輸出的表示式...