一些有趣的C語言題目

2021-08-25 14:07:46 字數 1644 閱讀 7971

問題2:寫乙個「標準」巨集,這個巨集輸入兩個引數並返回較小的乙個

答:#define min(x,y)((x)<(y)?(x):( y))//結尾沒有;

(注意幾個括號)

問題3:#與##的作用?

答:#是把巨集引數轉化為字串的運算子,##是把兩個巨集引數連線的運算子。

例如:#define str(arg)#arg則巨集str(你好)展開時為「你好」

#define name(y)name_y則巨集name(1)展開時仍為name_y

#define name(y)name _ ## y則巨集name(1)展開為name_1

#define declare(name,type)typename ## _ ## type ## _ type,

則巨集巨集declare(val,int)展開為int val_int_type

15 typedef在c語言中頻繁用以宣告乙個已經存在的資料型別的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子:

#define dps struct s *

typedef struct s * tps;

以上兩種情況的意圖都是要定義dps和tps作為乙個指向結構s指標。哪種方法更好呢?(如果有的話)為什麼?

這是乙個非常微妙的問題,任何人答對這個問題(正當的原因)是應當被恭喜的。答案是:typedef更好。思考下面的例子:

dps p1,p2;

// p1為結構體指標   p2為結構體

tps p3,p4;

// p3 p4為結構體指標

第乙個擴充套件為

struct s * p1,p2;

上面的**定義p1為乙個指向結構的指,p2為乙個實際的結構,這也許不是你想要的。第二個例子正確地定義了p3和p4兩個指標。晦澀的語法

問題4:結構體成員陣列大小為0

結構體陣列成員的大小為0是gnu c的乙個特性。好處是可以在結構體中分配不定長的大小。如

typedef struct st

st_t;

sizeof(st_t)等於8,即char c[0]的大小為0.

34、位操作(bit manipulation)

答: 嵌入式系統總是要使用者對變數或暫存器進行位操作。給定乙個整型變數a,寫兩段**,第乙個設定a的bit 3,第二個清除a 的bit 3。在以上兩個操作中,要保持其它位不變。

對這個問題有三種基本的反應

1)不知道如何下手。該被面者從沒做過任何嵌入式系統的工作。

2) 用bit fields。bit fields是被扔到c語言死角的東西,它保證你的**在不同編譯器之間是不可移植的,同時也保證了的你的**是不可重用的。我最近不幸看到 infineon為其較複雜的通訊晶元寫的驅動程式,它用到了bit fields因此完全對我無用,因為我的編譯器用其它的方式來實現bit fields的。從道德講:永遠不要讓乙個非嵌入式的傢伙粘實際硬體的邊。

3) 用 #defines 和 bit masks 操作。這是乙個有極高可移植性的方法,是應該被用到的方法。最佳的解決方案如下:

#define bit3 (0x1 << 3)

static int a;

void set_bit3(void)

void clear_bit3(void)

C語言 一些有意思的C語言題目,

有一些有意思的題目,然後我們來試著做一下 5位運動員參加了10公尺臺跳水比賽,有人讓他們 比賽結果 a選手說 b第一,我第三。b選手說 我第二,e第四。c選手說 我第一,d第二。d選手說 c最後,我第三。e選手說 我第四,a第一。排名判斷 include int main 日本某地發生了一件 案,警...

C語言基礎 C語言一些簡單題目(三)

完成猜數字遊戲 define crt secure no warnings 1 include includevoid menu int main else if num input else break case 2 i 0 break default printf 選擇錯誤 break syst...

一些有趣的函式

split 函式是用來處理字串的,遍歷字串,當遇到某一標誌時則將字串分割成列表。例如 s jhdj dkdskd s dskdh sdsdk sdksd skd sds kd sd s1 s.split 標誌設定為空格執行結果 jhdj dkdskd s dskdh sdsdk sdksd skd ...