
- C語言程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策語句
- C語言 - 決策語句
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈語句
- C語言 - 迴圈語句
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - 返回語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void 指標
- C語言 - 野指標
- C語言 - 解引用指標
- C語言 - 近指標、遠指標和巨型指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點 (.) 運算子
- C語言 - 列舉 (enum)
- C語言 - 結構體填充和壓縮
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入/輸出
- C語言 - 檔案 I/O (檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 編譯指示
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C語言程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言預處理器運算子
預處理器運算子是在#define指令的上下文中使用的特殊符號。這些運算子也稱為預處理器專用運算子。
在C語言中,定義了一組預處理器運算子,每個運算子都附帶一個重要的操作。本章將解釋在C語言中使用的不同型別的預處理器運算子。
大多數現代C編譯器都實現了以下預處理器運算子:
運算子 | 作用 |
---|---|
續行運算子 (/) | 用於續接過長的宏。 |
字串化運算子 (#) | 將對應的實際引數用雙引號括起來。 |
標記貼上運算子 (##) | 允許將用作實際引數的標記連線起來以形成其他標記。 |
defined 運算子 | 簡化在某些宏指令中編寫複合表示式的過程。 |
現在讓我們詳細討論每個預處理器運算子。
續行運算子 (/)
當宏非常複雜且跨越多行時,使用此運算子。如果宏展開中的邏輯很複雜,則需要換行並編寫跨越多行的程式碼。在這種情況下,宏續行運算子非常有用。
示例1:預處理器續行運算子 (/)
在下面的示例中,我們在下一行編寫宏的一部分,因此我們使用了宏續行預處理器運算子 (\)。
#include <stdio.h> #define message() { \ printf("TutorialsPoint Library contains\n"); \ printf("High quality Programming Tutorials"); \ } int main() { message(); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
TutorialsPoint Library contains High quality Programming Tutorials
示例2:預處理器續行運算子 (/)
在下面的示例中,宏定義涉及 switch case 語句的計算,因此它跨越多行,需要宏續行字元。
#include <stdio.h> #define SHAPE(x) switch(x) { \ case 1: printf("1. CIRCLE\n"); break; \ case 2: printf("2. RECTANGLE\n"); break; \ case 3: printf("3. SQUARE\n"); break; \ default: printf("default. LINE\n"); \ } int main() { SHAPE(1); SHAPE(2); SHAPE(3); SHAPE(0); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
1. CIRCLE 2. RECTANGLE 3. SQUARE default. LINE
字串化運算子 (#)
有時您可能希望將宏引數轉換為字串常量。“數字符號”或“字串化”運算子 (#) 將宏引數轉換為字串字面量,而不展開引數定義。此運算子只能用於具有指定引數列表的宏。
示例1:字串化運算子
請看下面的例子:
#include <stdio.h> #define stringize(x) printf(#x "\n") int main() { stringize(Welcome To TutorialsPoint); stringize("The Largest Tutorials Library"); stringize("Having video and Text Tutorials on Programming Languages"); }
輸出
執行此程式碼時,將產生以下輸出:
Welcome To TutorialsPoint "The Largest Tutorials Library" "Having video and Text Tutorials on Programming Languages"
示例2:字串化運算子
以下程式碼展示瞭如何使用**字串化運算子**將某些文字轉換為字串,而無需使用任何引號。
#include <stdio.h> #define STR_PRINT(x) #x main() { printf(STR_PRINT(This is a string without double quotes)); }
輸出
執行程式碼並檢查其輸出:
This is a string without double quotes
標記貼上運算子 (##)
雙數字符號或標記貼上運算子 (**##**),有時稱為合併運算子。它通常用於在展開宏時將兩個標記合併為一個。
當宏展開時,每個“**##**”運算子兩側的兩個標記將組合成一個標記,然後在宏展開中用該標記替換“**##**”和這兩個原始標記。
示例1:標記貼上運算子 (##)
請看下面的例子:
#include <stdio.h> #define PASTE(arg1,arg2) arg1##arg2 main() { int value_1 = 1000; printf("value_1 = %d\n", PASTE(value_,1)); }
輸出
執行此程式碼時,將產生以下輸出:
value_1 = 1000
示例2:標記貼上運算子 (##)
在下面的示例中,我們將兩個引數傳遞給宏。
#include <stdio.h> #define TOKENS(X, Y) X##Y int main() { printf("value1: %d\n",TOKENS(12,20)); printf("value2: %d\n",TOKENS(12,20)+10); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
value1: 1220 value2: 1230
defined 運算子
defined 預處理器運算子只能用作**#if**和**#elif**指令的一部分。defined 運算子的語法如下:
#if defined(macro1) // code #elif defined(macro2) // code #endif
它用於在常量表達式中確定是否定義了識別符號。如果定義了指定的識別符號,則值為真(非零)。如果未定義該符號,則值為假(零)。
示例1:defined 運算子
在此示例中,defined 運算子用於檢查是否定義了 DEBUG 宏。如果已定義,則程式列印“DEBUG 模式已開啟”。否則,它列印“DEBUG 模式已關閉”。
#include <stdio.h> #define DEBUG 1 int main() { #if defined(DEBUG) printf("DEBUG mode is on.\n"); #else printf("DEBUG mode is off.\n"); #endif return 0; }
輸出
執行程式碼並檢查其輸出:
DEBUG mode is on.
示例2:defined 運算子
以下程式碼檢查 square 宏是否已被定義,如果是,則使用給定的“x”值為 5 展開它。
#include <stdio.h> #define square(x) ((x) * (x)) int main(){ #if defined square printf("The square of the given number is: %d", square(5)); #endif return 0; }
輸出
執行此程式碼時,將產生以下輸出:
The square of the given number is: 25