printf函式的求值順序問題

2021-09-30 05:09:32 字數 801 閱讀 9964

學了這麼久的c語言,沒想到對c語言中常見的printf函式還不是很了解。

有以下程式段:

設int arr=;

int *ptr=arr;

*(ptr++)+=123;

printf("%d,%d",*ptr,*(++ptr));

答案為什麼是:8,8

這是一道華為面試題。

這個題考的關鍵就是printf的運算順序。

printf的引數,函式printf從左往右讀取,然後將先讀取放到棧底,最後讀取的放在棧頂,處理時候是從棧頂開始的,所有從右邊開始處理的。

這個是比較繞的乙個問題,主要考驗的是i++ 和++i :

我們逐個分析:

int arr=;

int *ptr=arr;

//這裡ptr是陣列的首位址。

*(ptr++)+=123;

//這個我們將之拆分

//1. 首先是 ptr++, 這個時候重點看到是後++,也就是說返回的ptr還是原來的ptr的值,也就是arr的首位址。

//那麼這句話也就轉換成了 a[0]+=123,即運算後 a[0] = 129

//2. 這整句執行完之後,ptr才真正的++。也就是說,這個時候ptr指向的陣列第二個位置,也就是7

printf("%d,%d",*ptr,*(++ptr));

//這一句有乙個函式引數入棧的順序,一般vc的編譯器是從右往左入棧,那麼這個運算也自然是從右往左。

//++ptr之後ptr再次向後乙個位置移動,即a[2],8。

//前面的*ptr自然也就是8,所以這句執行之後輸出的是8,8

printf函式的求值順序問題

學了這麼久的c語言,沒想到對c語言中常見的printf函式還不是很了解。有以下程式段 設int arr int ptr arr ptr 123 printf d,d ptr,ptr 答案為什麼是 8,8 這是一道華為面試題。這個題考的關鍵就是printf的運算順序。printf的引數,函式print...

函式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函式輸出順序的理解

注意 筆者並未研究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...