每日一題(十)

2021-10-24 21:15:41 字數 2685 閱讀 1801

分析如下程式的輸出:

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老師的方法二 仍舊轉化為動態規劃,但是為節省空間不再開個...