C語言 運算子與 運算子

2021-09-25 17:26:09 字數 1617 閱讀 6694

我們平時使用帶參巨集時,字串中的巨集引數是沒有被替換的。例如:

輸出結果為:

然而,我們期望輸出的結果是:

5+20

=2513+

14=27

這該怎麼做呢?其實,c語言允許在字串中包含巨集引數。在類函式巨集(帶參巨集)中,#號作為乙個預處理運算子,可以把記號轉換成字串。例如,如果a是乙個巨集形參,那麼#a就是轉換為字串"a"的形參名。這個過程稱為字串化(stringizing)。以下程式演示這個過程:

輸出結果為:

這就達到我們想要的結果了。所以,#運算子可以完成字串化(stringizing)的過程。

與#運算子類似,##運算子可用於類函式巨集(帶參巨集)的替換部分。##運算子可以把兩個記號組合成乙個記號。例如,可以這樣做:

#define xname(n) x##n
然後,巨集xname(4)將展開x4。以下程式演示##運算子的用法:

輸出結果為:

注意:print_xn()巨集用#運算子組合字串,##運算子把記號組合為乙個新的識別符號。

其實,##運算子在這裡看來並沒有起到多大的便利,反而會讓我們感覺到不習慣。但是,使用##運算子有時候是可以提高封裝性及程式的可讀性的。如跑實時作業系統的stm32程式中,關於gpio的硬體驅動中有如下**:

#define __stm32_pin(index, gpio, gpio_index) \

假設這樣使用該巨集:

__stm32_pin(7

, c,

13)

該巨集將展開為:

然後這就可以很方便的將要使用的硬體引腳這麼一一列出來,然後再拿去進行配置:

以上就是關於#運算子與##運算子的筆記,用#運算子組合字串,##運算子把記號組合為乙個新的識別符號。如有錯誤歡迎指出。資料:『rt-thread-iot**』、『c primer plus』。

NOT運算子與 運算子

6.4.2 not運算子與 運算子 對於簡單的條件查詢,not運算子與 運算子的功能幾乎沒有什麼區別,那麼not運算子的優勢體現在 呢?答案是它可以與其他運算子組合使用,這一點是 運算子所不能實現的。在6.4.1節已經介紹了not運算子與in運算子組合使用的例子,下面給出乙個not運算子與betwe...

C語言 運算子和 運算子

變數 代表 取變數的位址 變數 代表 指標型的變數 取址運算子 用來取得其運算元的位址。如果運算元 x 的型別為 t,則表示式 x 的型別是 t 型別指標 指向 t 的指標 取址運算子的運算元必須是在記憶體中可定址到的位址。換句話說,該運算子只能用於函式或物件 例如左值 而不可以用於位欄位,以及那些...

C語言算術運算子與位運算子

1.算術操作符 前兩個不用多說,即是乘號,是求餘 取模 運算,注意 兩側運算元需均為整數 若除數與被除數符號不同,則結果符號與被除數保持一致。如 14 3 2 14 3 2 是求商運算,注意 若 的除數與被除數均為整數將執行舍位 即捨去小數中任何部分 如14 3 4 若除數與被除數符號不同,則結果符...