注意:筆者並未研究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 格式控制字串 輸出項列表 語句中 輸出項列表 列出要輸出的表示式...