當前位置:首頁 » 編程軟體 » c語言預編譯if指令

c語言預編譯if指令

發布時間: 2022-12-15 12:51:31

c語言幾個預編譯指令的用法

處理指令是以#號開頭的代碼行。#號必須是該行除了任何空白字元外的第一個字元。#後是指令關鍵字,在關鍵字和#號之間允許存在任意個數的空白字元。整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源代碼做某些轉換。下面是部分預處理指令:
指令 用途
# 空指令,無任何效果
#include 包含一個源代碼文件
#define 定義宏
#undef 取消已定義的宏
#if 如果給定條件為真,則編譯下面代碼
#ifdef 如果宏已經定義,則編譯下面代碼
#ifndef 如果宏沒有定義,則編譯下面代碼
#elif 如果前面的#if給定條件不為真,當前條件為真,則編譯下面代碼
#endif 結束一個#if……#else條件編譯塊
#error 停止編譯並顯示錯誤信息
希望可以幫到你,謝謝!

Ⅱ 請問C語言中的預處理命令ifdef是什麼意思

這幾個宏是為了進行條件編譯。一般情況下,源程序中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是「條件編譯」。有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。 條件編譯命令最常見的形式為: #ifdef 標識符 程序段1 #else 程序段2 #endif 它的作用是:當標識符已經被定義過(一般是用#define命令定義),則對程序段1進行編譯,否則編譯程序段2。 其中#else部分也可以沒有,即: #ifdef 程序段1 #endif 這里的「程序段」可以是語句組,也可以是命令行。這種條件編譯可以提高C源程序的通用性。如果一個C源程序在不同計算機系統上系統上運行,而不同的計算機又有一定的差異。例如,我們有一個數據類型,在Windows平台中,應該使用long類型表示,而在其他平台應該使用float表示,這樣往往需要對源程序作必要的修改,這就降低了程序的通用性。可以用以下的條件編譯: #ifdef WINDOWS #define MYTYPE long #else #define MYTYPE float #endif 如果在Windows上編譯程序,則可以在程序的開始加上 #define WINDOWS 這樣則編譯下面的命令行: #define MYTYPE long 如果在這組條件編譯命令之前曾出現以下命令行: #define WINDOWS 0 則預編譯後程序中的MYTYPE都用float代替。這樣,源程序可以不必作任何修改就可以用於不同類型的計算機系統。當然以上介紹的只是一種簡單的情況,可以根據此思路設計出其它的條件編譯。 例如,在調試程序時,常常希望輸出一些所需的信息,而在調試完成後不再輸出這些信息。可以在源程序中插入以下的條件編譯段: #ifdef DEBUG print ("device_open(%p)\n", file); #endif 如果在它的前面有以下命令行: #define DEBUG 則在程序運行時輸出file指針的值,以便調試分析。調試完成後只需將這個define命令行刪除即可。有人可能覺得不用條件編譯也可達此目的,即在調試時加一批printf語句,調試後一一將printf語句刪除去。的確,這是可以的。但是,當調試時加的printf語句比較多時,修改的工作量是很大的。用條件編譯,則不必一一刪改printf語句,只需刪除前面的一條「#define DEBUG」命令即可,這時所有的用DEBUG作標識符的條件編譯段都使其中的printf語句不起作用,即起統一控制的作用,如同一個「開關」一樣。 有時也採用下面的形式: #ifndef 標識符 程序段1 #else 程序段2 #endif 只是第一行與第一種形式不同:將「ifdef」改為「ifndef」。它的作用是:若標識符未被定義則編譯程序段1,否則編譯程序段2。這種形式與第一種形式的作用相反。 以上兩種形式用法差不多,根據需要任選一種,視方便而定。 還有一種形式,就是#if後面的是一個表達式,而不是一個簡單的標識符: #if 表達式 程序段1 #else 程序段2 #endif 它的作用是:當指定的表達式值為真(非零)時就編譯程序段1,否則編譯程序段2。可以事先給定一定條件,使程序在不同的條件下執行不同的功能。 例如:輸入一行字母字元,根據需要設置條件編譯,使之能將字母全改為大寫輸出,或全改為小寫字母輸出。 #define LETTER 1 main() { char str[20]="C Language",c; int i=0; while((c=str[i])!='\0'){ i++; #if LETTER if(c>='a'&&c<='z') c=c-32; #else if(c>='A'&&c<='Z') c=c+32; #endif printf("%c",c); } } 運行結果為:C LANGUAGE 現在先定義LETTER為1,這樣在預處理條件編譯命令時,由於LETTER為真(非零),則對第一個if語句進行編譯,運行時使小寫字母變大寫。如果將程序第一行改為: #define LETTER 0 則在預處理時,對第二個if語句進行編譯處理,使大寫字母變成小寫字母(大寫字母與相應的小寫字母的ASCII代碼差32)。此時運行情況為: c language 有人會問:不用條件編譯命令而直接用if語句也能達到要求,用條件編譯命令有什麼好處呢?的確,此問題完全可以不用條件編譯處理,但那樣做目標程序長(因為所有語句都編譯),而採用條件編譯,可以減少被編譯的語句,從而減少目標的長度。當條件編譯段比較多時,目標程序長度可以大大減少。

Ⅲ C語言if語句的使用講解

if語句的使用

用if語句可以構成分支結構。它根據給定的條件進行判斷,以決定執行某個分支程序段。C語言的if語句有三種基本形式。

語句的三種形式

1) 第一種形式為基本形式:if

if(表達式) 語句

其語義是:如果表達式的值為真,則執行其後的語句,否則不執行該語句。

【例1】

#include

int main(void){

int a,b,max;

printf(" input two numbers: ");

scanf("%d%d",&a,&b);

max=a;

if (max

printf("max=%d",max);

return 0;

}

本常式序中,輸入兩個數a、b。把a先賦予變數max,再用if語句判別max和b的大小,如max小於b,則把b賦予max。因此max中總是大數,最後輸出max的值。

2) 第二種形式為: if-else

if(表達式)

語句1;

else

語句2;

其語義是:如果表達式的值為真,則執行語句1,否則執行語句2 。

【例2】

#include

int main(void){

int a, b;

printf("input two numbers: ");

scanf("%d%d",&a,&b);

if(a>b)

printf("max=%d ",a);

else

printf("max=%d ",b);

return 0;

}

輸入兩個整數,輸出其中的大數。改用if-else語句判別a,b的大小,若a大,則輸出a,否則輸出b。

3) 第三種形式為if-else-if形式

前二種形式的if語句一般都用於兩個分支的情況。當有多個分支選擇時,可採用if-else-if語句,其一般形式為:

if(表達式1)

語句1;

else if(表達式2)

語句2;

else if(表達式3)

語句3;

else if(表達式m)

語句m;

else

語句n;

其語義是:依次判斷表達式的值,當出現某個值為真時,則執行其對應的語句。然後跳到整個if語句之外繼續執行程序。 如果所有的表達式均為假,則執行語句n。然後繼續執行後續程序。 if-else-if語句的執行過程如下圖所示。

【例3】

#include

int main(void){

char c;

printf("input a character: ");

c=get);

if(c<32)

printf("This is a control character ");

else if(c>='0'&&c<='9')

printf("This is a digit ");

else if(c>='A'&&c<='Z')

printf("This is a capital letter ");

else if(c>='a'&&c<='z')

printf("This is a small letter ");

else

printf("This is an other character ");

return 0;

}

本例要求判別鍵盤輸入字元的類別。可以根據輸入字元的ASCII碼來判別類型。由ASCII碼表可知ASCII值小於32的為控制字元。在「0」和「9」之間的為數字,在「A」和「Z」之間為大寫字母, 在「a」和「z」之間為小寫字母,其餘則為其它字元。這是一個多分支選擇的問題,用if-else-if語句編程,判斷輸入字元ASCII碼所在的范圍,分別給出不同的輸出。例如輸入為「g」,輸出顯示它為小寫字元。

if語句的嵌套

當if語句中的執行語句又是if語句時,則構成了if 語句嵌套的情形。其一般形式可表示如下:

if(表達式)

if語句;

或者為:

if(表達式)

if語句;

else

if語句;

在嵌套內的if語句可能又是if-else型的,這將會出現多個if和多個else重疊的情況,這時要特別注意if和else的配對問題。例如:

if(表達式1)

if(表達式2)

語句1;

else

語句2;

其中的else究竟是與哪一個if配對呢?應該理解為:

if(表達式1)

if(表達式2)

語句1;

else

語句2;

還是應理解為:

if(表達式1)

if(表達式2)

語句1;

else

語句2;

為了避免這種二義性,C語言規定,else 總是與它前面最近的if配對,因此對上述例子應按前一種情況理解。

【例4】

#include

int main(void){

int a,b;

printf("please input A,B: ");

scanf("%d%d",&a,&b);

if(a!=b)

if(a>b) printf("A>B ");

else printf("A

else printf("A=B ");

return 0;

}

比較兩個數的大小關系。本例中用了if語句的嵌套結構。採用嵌套結構實質上是為了進行多分支選擇,實際上有三種選擇即A>B、A

簡單講解C語言中宏的定義與使用

宏定義是預編譯功能的一種, 預編譯又稱為預處理, 是為編譯做的預備工作的階段。處理#開頭的指令, 比如拷貝 #include 包含的文件代碼,#define宏定義的替換,條件編譯等。

使用宏定義的好處:使用宏定義的好處:可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如 π 這個常量,我們有時候會在程序的多個地方使用,如果每次使用都重新定義,一來比較麻煩,二來容易出錯,所以我們可以把 π 做成宏定義來使用。

語法說明:

(1)宏名一般用大寫

(2)使用宏可提高程序的`通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:數組大小常用宏定義

(3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。

(4)宏定義末尾不加分號;

(5)宏定義寫在函數的花括弧外邊,作用域為其後的程序,通常在文件的最開頭。

(6)可以用#undef命令終止宏定義的作用域

(7)宏定義可以嵌套

(8)字元串" "中永遠不包含宏

(9)宏定義不分配內存,變數定義分配內存。

定義:

#define 宏名 內容#define kArrLen 10 // OC駝峰命名法:首字元為k,其他單詞首字元大寫#define ARR_LEN 10 // C語言中的宏命名規范:所有字母大寫,單詞用下劃線分隔

例如:

#define PI 3.1415926

我們就可以使用 PI 來代替 3.1415926 即可:

float r = 0.5;float area = PI * r * r;printf("area = %fn", area);

在程序預編譯階段會把 PI 替換成 3.1415926:

float area = 3.1415926 * r * r;

宏定義內容很簡單,也很好理解,但是有幾個如下的注意事項:

1、因為宏定義只是簡單的替換,如果宏定義的內容有運算的時候,要把每個變數加上括弧,以免影響運算的優先順序

比如:#define MUL(A, B) (A * B)

使用方法:

MUL(3 + 5, 5 + 6) //會替換成 3 + 5 * 5 + 6 = 34

我們希望(3 + 5) * (5 + 6),所以定義宏定義的時候應該:

#define MUL(A, B) ((A) * (B))

2、注意宏定義後面沒有分號(;),它不是一條語句

3、宏定義是在程序編譯前期進行替換,此時程序還沒有編譯

Ⅳ c語言中IF的用法!!!急求!!!

1.if語句的一般格式
if(表達式)
{語句組1;}
[else
{語句組2;} ]
(1)if語句中的「表達式」必須用「(」和「)」括起來。
(2)else子句(可選)是if語句的一部分,必須與if配對使用,不能單獨使用。
(3)當if和else下面的語句組,僅由一條語句構成時,也可不使用復合語句形式(即去掉花括弧)。

2.if語句的執行過程
(1)預設else子句時
當「表達式」的值不等於0(即判定為「邏輯真」)時,則執行語句組1,否則直接轉向執行下一條。
(2)指定else子句時
當「表達式」的值不等於0(即判定為「邏輯真」)時,則執行語句組1,然後轉向下一條語句;否則,執行語句組2。如圖4-1(b)所示。
3.if語句的嵌套與嵌套匹配原則
if語句允許嵌套。所謂if語句的嵌套是指,在「語句組1」或(和)「語句組2」中,又包含有if語句的情況。
if語句嵌套時,else子句與if的匹配原則:與在它上面、距它最近、且尚未匹配的if配對。
為明確匹配關系,避免匹配錯誤,強烈建議:將內嵌的if語句,一律用花括弧括起來。

Ⅳ c語言 #if 和if的區別

加#的都是編譯預處理語句:
#if 表達式
#endif
表示的意思是如果if後面的表達式不為0的話就編譯#if#endif之間的語句,否則就不編譯。

Ⅵ #if #endif 是什麼意思啊

#ifdef #endif是C語言的條件編譯。

條件編譯是根據實際定義宏(某類條件)進行代碼靜態編譯的手段。可根據表達式的值或某個特定宏是否被定義來確定編譯條件。

如下面的例子:

#ifdef 標志符

程序段1

#else

程序段2

#endif

當定義了標志符則對程序段1進行編譯,而沒有定義標志符時則編譯程序段2。

(6)c語言預編譯if指令擴展閱讀

條件編譯的作用

條件編譯跟事物具有多樣性一樣。我們需要對不同的狀況下採取不同的操作。例如程序的運行平台具有這種多樣性,我們在window平台下編寫的程序,可能使用某一個庫或者與硬體相關的屬性、方法。

現在要將我們的程序移植到別的計算機系統的時候,例如Linux系統。那麼程序上依賴的庫或者有些和硬體相關聯的屬性和方法不得不更改,那麼我們只能在編寫程序的時候提高程序的健壯性,此時就需要條件編譯語句為我們實現這樣的功能。

Ⅶ c語言中預處理命令都有哪些

我們可以在C源程序中插入傳給編譯程序的各中指令,這些指令被稱為預處理器指令,它們擴充了程序設計的環境。現把常用的預處理命令總結如下:
1. 預處理程序
按照ANSI標準的定義,預處理程序應該處理以下指令:
#if #ifdef #ifndef #else #elif
#endif
#define
#undef
#line
#error
#pragma
#include
顯然,上述所有的12個預處理指令都以符號#開始,,每條預處理指令必須獨佔一行。
2. #define
#define指令定義一個標識符和一個串(也就是字元集),在源程序中發現該標識符時,都用該串替換之。這種標識符稱為宏名字,相應的替換稱為宏代換。一般形式如下:
#define macro-name char-sequence
這種語句不用分號結尾。宏名字和串之間可以有多個空白符,但串開始後只能以新行終止。
例如:我們使用LEFT代表1,用RIGHT代表0,我們使用兩個#define指令:
#define LEFT 1
#define RIGHT 0
每當在源程序中遇到LEFT或RIGHT時,編譯程序都用1或0替換。
定義一個宏名字之後,可以在其他宏定義中使用,例如:
#define ONE 1
#define TWO ONE+ONE
#define THREE ONE+TWO
宏代換就是用相關的串替代標識符。因此,如果希望定義一條標准錯誤信息時,可以如下定義:
#define ERROR_MS 「Standard error on input \n」
如果一個串長於一行,可在行尾用反斜線」\」續行,如下:
#define LONG_STRING 「This is a very very long \
String that is used as an example」
3. #error
#error指令強制編譯程序停止編譯,它主要用於程序調試。#error指令的一般形式是:
#error error-message
注意,宏串error-message不用雙引號包圍。遇到#error指令時,錯誤信息被顯示,可能同時還顯示編譯程序作者預先定義的其他內容。
4. #include
程序中的#include指令要求編譯程序讀入另一個源文件。被讀入文件的名字必須用雙引號(「」)或一對尖括弧(<>)包圍,例如:
#include 「stdio.h」
#include <stdio.h>
都使C編譯程序讀入並編譯頭文件以用於I/O系統庫函數。
包含文件中可以包含其他#include指令,稱為嵌套包含。允許的最大嵌套深度隨編譯器而變。
文件名被雙括弧或尖括弧包圍決定了對指定文件的搜索方式。文件名被尖括弧包圍時,搜索按編譯程序作者的定義進行,一般用於搜索某些專門放置包含文件的特殊目錄。當文件名被雙括弧包圍時,搜索按編譯程序實時的規定進行,一般搜索當前目錄。如未發現,再按尖括弧包圍時的辦法重新搜索一次。
通常,絕大多數程序員使用尖括弧包圍標準的頭文件,雙引號用於包圍與當前程序相關的文件名。

5. 條件編譯指令
若干編譯指令允許程序員有選擇的編譯程序源代碼的不同部分,這種過程稱為條件編譯。
5.1#if、#else、#elif #endif
條件編譯指令中最常用的或許是#if,#else,#elif和#endif。這些指令允許程序員根據常數表達式的結果有條件的包圍部分代碼。
#if的一般形式是:
#if constant-expression
Statement sequence
#endif
如#if後的常數表達式為真,則#if和#endif中間的代碼被編譯,否則忽略該代碼段。#endif標記#if塊的結束。
#else指令的作用與C語言的else相似,#if指令失敗時它可以作為備選指令。例如:
#include <stdio.h>
#define MAX 100
Int main(void)
{
#if MAX>99
printf(「Compiled for array greater than 99.\n」);
#else
printf(「Complied for small array.\n」);
#endif
return 0;
}
注意,#else既是標記#if塊的結束,也標記#else塊的開始。因為每個#if只能寫一個#endif匹配。
#elif指令的意思是「否則,如果」,為多重編譯選擇建立一條if-else-if(如果-否則-如果鏈)。如果#if表達式為真,該代碼塊被編譯,不測試其他#elif表達式。否則,序列中的下一塊被測試,如果成功則編譯之。一般形式如下:
#if expression
Statement sequence
#elif expression1
Statement sequence
#elif expression2
Statement sequence
.
.
.
#elif expression
Statement sequence
#endif
5.2#ifdef和#ifndef
條件編譯的另一個方法是使用編譯指令#ifdef和#ifndef,分別表示「如果已定義」和「如果未定義」。#ifdef的一般形式如下:
#ifdef macro-name
Statement sequence
#endif
如果macro-name原先已經被一個#define語句定義,則編譯其中的代碼塊。
#ifndef的一般形式是:
#ifndef macro-name
Statement sequence
#endif
如果macro-name當前未被#define語句定義,則編譯其中的代碼塊。

我認為,用這種,可以很方便的開啟/關閉整個程序的某項特定功能。
#ifdef和#ifndef都可以使用#else或#elif語句。
#inlucde <stdio.h>
#define T 10
Int main(void)
{
#ifdef t
Printf(「Hi T\n」);
#else
Printf(「Hi anyone\n」);
#endif
#ifndef M
Printf(「M Not Defined\n」);
#endif
Return 0;
}
6. #undef
#undef指令刪除前面定義的宏名字。也就是說,它「不定義」宏。一般形式為:
#undef macro-name
7. 使用defined
除#ifdef之外,還有另外一種確定是否定義宏名字的方法,即可以將#if指令與defined編譯時操作符一起使用。defined操作符的一般形式如下:
defined macro-name
如果macro-name是當前定義的,則表達式為真,否則為假。
例如,確定宏MY是否定義,可以使用下列兩種預處理命令之一:
#if defined MY

#ifdef MY
也可以在defined之前加上感嘆號」!」來反轉相應的條件。例如,只有在DEBUG未定義的情況下才編譯。
#if !defined DEBUG
Printf(「Final Version!\n」);
#endif
使用defined的一個原因是,它允許由#elif語句確定的宏名字存在。
8. #line
#line指令改變__LINE__和__FILE__的內容。__LINE__和__FILE__都是編譯程序中預定義的標識符。標識符__LINE__的內容是當前被編譯代碼行的行號,__FILE__的內容是當前被編譯源文件的文件名。#line的一般形式是:
#line number 「filename」
其中,number是正整數並變成__LINE__的新值;可選的「filename」是合法文件標識符並變成__FILE__的新值。#line主要用於調試和特殊應用。

9. #pragma
#pragma是編譯程序實現時定義的指令,它允許由此向編譯程序傳入各種指令。例如,一個編譯程序可能具有支持跟蹤程序執行的選項,此時可以用#pragma語句選擇該功能。編譯程序忽略其不支持的#pragma選項。#pragma提高C源程序對編譯程序的可移植性。
10. 預處理操作符#和##
有兩個預處理操作符:#和##,它們可以在#define中使用。
操作符#通常稱為字元串化的操作符,它把其後的串變成用雙引號包圍的串。例如:
#include <stdio.h>
#define mkstr(s) #s
int main(void)
{
Printf(mkstr(I like C));
Return 0;
}
預處理程序把以下的語句:
Printf(mkstr(I like C));
變成
Printf(「I like C」);
操作符##把兩個標記拼在一起,形成一個新標記。例如:
#include <stdio.h>
#define concat(a,a) a##b
int main(void)
{
Int xy = 10;
Printf(「%d」,concat(x,y));
Return 0;
}
預處理程序把以下語句:
Printf(「%d」,concat(x,y));
變成
Printf(「%d」,xy);
操作符#和##主要作用是允許預處理程序對付某些特殊情況,多數程序中並不需要。
11. 預定義宏
C規范了5個固有的預定義宏,它們是:
__LINE__
__FILE__
__DATE__
__TIME__
__STDC__
__LINE__和__FILE__包含正在編譯的程序的行號和文件名。
__DATE__和內容形如month/day/year(月/日/年)的串,代表源文件翻譯成目標碼的日期。
__TIME__中的串代表源代碼編譯成目標碼的時間,形如hour:minute:second(時:分:秒)
如果__STDC__的內容是十進制常數1,則表示編譯程序的實現符合標准C。

Ⅷ 請教C語言中if語句和預編譯#if語句的區別以及#if 0的意思

您好,
在c語言的
if
判斷語句中
(舉例給您說吧)
n==5
表示:判斷n與5的值是否相等,相當於數學中的等於號("="),如果想等則判斷語句為真,執行語句中的代碼。若不相等則跳出
if
語句.
n%5==0
中"%"表示"取余"運算。(a
%
b
就是計算
a
除以
b
得出的余數。)
if(n%5==0
)則表示:判斷n是否是5的整數倍,如果是,則余數為0,0==0,為真。故執行if
語句中的代碼。若n不是5的倍數,假設為1,1==0,為假。則跳出if語句

Ⅸ C語言問題:#if #endif #else是什麼意思呀~~

#開頭的語句,是預編譯指令
也就是說,這些語句,在編譯之前,就對他們進行了處理
#include
<stdio.h>
//告訴編譯器,要參與編譯的文件
#define
r
16
//告訴編譯器,r就是16
#if
r==16
//告訴編譯器,r==16的時候,編譯下面這段,否則編譯else部分的內容
void
p(int
a)
{
printf("%x",a);
}
#else
//告訴編譯器,#if的另外一個部分
void
p(int
a)
{
printf("%d",a);
}
#endif
//告訴編譯器,#if的結束
void
main()
{
p(32);
}

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:811
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:1079
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:783
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:948
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:842
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1192
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:414
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:293
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:969
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:937