分析如下程式的輸出:
void
fun(
int m,
int n)
intmain
(void
)
主要考察是呼叫函式的時候引數的入棧順序以及變數的運算,引數入棧順序一般是從右到左,所以先執行++k,將4傳給n;再執行k += 3將7的值傳給m。注意這裡是k做運算之後才傳入的函式,所以k += 3, ++k並不是在呼叫函式的棧中執行的,所以k的值是儲存下來的,所以最終輸出為:
m = 7, n = 4
k = 7
這種方式和編譯器中得函式呼叫關係相關即先**棧順序。不過不同編譯器得處理不同。也是因為 c 標準中對這種方式說明為未定義,所以各個編譯器廠商都有自己得理解,所以最後產生得結果完全不同。因為這樣,所以遇見這種函式,我們首先要考慮我們得編譯器會如何處理這樣得函式,其次看函式得呼叫方式,不同得呼叫方式,可能產生不同得結果。最後是看編譯器優化。分析下面程式:
#include
void
fun(
int b[
3])int
main
(void),
,};fun
(a);
printf
("a[2][1] = %d\n"
, a[2]
[1])
;return0;
}
首先要了解陣列傳入函式後的變化**:我們知道陣列傳入函式的時候,會轉換為指標,但是對於二維陣列,只轉換一次**,即int b[3]
傳入函式的時候是以
int (*b)[3]
的形式,即乙個指向陣列的指標,陣列中有三個元素。所以傳入a後,相當於b = a[0]
。
++b
代表指標b移動乙個步長的位置,這裡b指向乙個三個元素的int型陣列,所以++b
之後b = a[1]
。
指向b[1][1] = 120
, 其中b[1][1]
相當於*(*(b+1)+1)
,相當於指標b偏移了乙個步長之後又偏移了乙個元素的位置,用a表示a[1+1][0+1]
即a[2][1] = 120
,所以printf輸出的就是120。
用一段程式說明:
#include
#define a
#define b
void
test
(int a,
int b)
intmain
(void
)
如果是#if defined(a)&&defined(b)
的形式,輸出:ba
因為#ifdef雖然我們最常見也用得最多,可是#if defined(***)卻可以有 &&,||,!,邏輯與,邏輯或,邏輯非等操作,而#ifdef卻不支援這樣的特性。
程式如下:
void
swap
(int
*a,int
*b)
請問上述程式可否實現兩個int資料的交換?看起來沒毛病,可是容易忽略乙個問題,那就是int是有符號資料的溢位!
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-nwq6o0su-1602905143136)(…/…/…/%e8%bd%af%e4%bb%b6%e7%ae%a1%e5%ae%b6/typora/%e5%9b%be%e7%89%87%e5%ba%93/image-20201017103737242.png)]
**只有當a、b同符號的時候才可能傳送溢位!!!**因為這裡有加減操作,所以當兩個同符號的資料相加的時候就有可能溢位。
比如:交換-5, -7。 以4bit為例。
-5 = 1011 (補碼) -7 = 1001 (補碼)
(-5)+ (-7)=10100=0100=4 (溢位後為4)
4-(-7)= 4 +7=0100 + 0111 = 1011 = -5的補碼
4-(-5)= 4 + 5 = 0100 + 0101 = 1001 = -7的補碼
注意,函式是在第一步的時候可能溢位,但是後面的操作是基於溢位的資料的,而且後面又可以把溢位的部分減回來,所以這裡雖然可能會傳送溢位,但是仍然可以得到正確的資料。
程式如下:
#include
void
test()
intmain
(void
)
輸出結果為:
int: 4
double: 8
test1: 8
test2: 8
如果按照我們分析,(100 < 1 ? 0.1 : 1)
輸出的會是1,也就是int型資料,但是實際上被轉換為double型別了。
實際上三目運算最後輸出的是乙個變數,在乙個表示式中,資料格式要統一,所以在得出運算之前就將所有變數轉換為同一種資料格式了。
每日一題 1
題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...
每日一題2018 3 21
leetcode 2 模擬十進位制運算考察單鏈表基本操作。題無難點,個人基礎需要提高。definition for singly linked list.struct listnode class solution while p while q if shi val s next null ret...
每日一題2018 3 22
leetcode 03 最長不重複子串 第一反應就是動態規劃。看到了網上的方法一。直接把問題簡化為找兩個重複字元間的最長距離,太巧妙了!class solution if i idx max locs s i i return max ling老師的方法二 仍舊轉化為動態規劃,但是為節省空間不再開個...