以#号開頭的都是編譯預處理指令,它們不是C語言的成分,但是C程序離不開它們,#define用來定義一個宏,程序在預處理階段将用define定義的來内容進行了替換。因此在程序運行時,常量表中并沒有用define定義的常量,系統不為它分配内存。define定義的常量,預處理時隻是直接進行了替換,,它用來将一個标識符定義為一個字符串,該标識符被稱為宏名,被定義的字符串稱為替換文本。,因此在編譯時它不對宏的定義進行檢查,作用域不影響對常量的訪問 。它的常量值隻能是字符串或數字。 該命令有兩種格式:一種是簡單的常量宏定義, 另一種是帶參數的宏定義。
不帶參數的宏:#define< 名字 >< 值 > 要注意,沒有結尾的分号,因為不是C的語句,名字必須是一個單詞,值可以是各種東西,宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這隻是一種簡單的代換,字符串中可以含任何字符,可以是常數,也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,隻能在編譯已被宏展開後的源程序時發現。
注意.宏定義不是說明或語句,在行末不必加分号,如加上分号則連分号也一起置換。宏定義其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令
帶參宏定義的一般形式為:#define 宏名(形參表)字符串,也是沒有結尾的分号,可以帶多個參數 ,#define NB(a,b)((a)>(b)?(b):(a)), 也可以組合(嵌套)使用其他宏,注意 帶參數宏的原則 一切都要有括号,參數出現的每個地方都要有括号。帶參數的宏在大型的程序的代碼中使用非常普遍,在#和##這兩個運算符的幫助下可以很複雜,如“産生函數”,但是有些宏會被inline函數代替(C 的函數)
使用宏好處:提高運行效。
定義的标識符不占内存,隻是一個臨時的符号,預編譯後這個符号就不存在了。在簡單的程序使用帶參數的宏定義可完成函數調用的功能,又能減少系統開銷,提高運行效率。正如C語言中所講,函數的使用可以使程序更加模塊化,便于組織,而且可重複利用。
“方便程序的修改”。使用宏定義可以用宏代替一個在程序中經常使用的常量。注意,是“經常”使用的。這樣,當需要改變這個常量的值時,就不需要對整個程序一個一個進行修改,隻需修改宏定義中的常量即可。且當常量比較長時,使用宏就可以用較短的有意義的标識符來代替它,這樣編程的時候就會更方便,不容易出錯。因此,宏定義的優點就是方便和易于維護。
2、enum枚舉//例子:/求球的體積
#include<stdio.h>
#include<math.h>
//對于半徑為 r 的球,其體積的計算公式為 V =4/3*Π*r^3
//這裡取Π為3.14
//這裡給定r的值,求V
#define PI 3.14
int main(void) {
double r;
scanf("%lf", &r);
double sum = 0;
sum = (4.0 / 3.0) * PI*pow(r, 3);//這裡用PI替換掉了 3.14
printf("%f.2", sum);
}
#include<stdio.h>//合例子:輸入數字查看是星期幾
int main(void) {
enum week {Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun}today;
//在這裡我們給Mon賦值了一,後面Tue以後的都相應加一賦值
scanf("%d", &today);
switch (today) {
case Mon: puts("Monday"); break;
case Tue: puts("Tuesday"); break;
case Wed: puts("Wednesday"); break;
case Thu: puts("Thursday"); break;
case Fri: puts("Friday"); break;
case Sat: puts("Saturday"); break;
case Sun: puts("Sunday"); break;
default: puts("no day");
}
return 0;
}
枚舉型是一個集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗号,隔開。它是一種用戶定義的數據類型,它用關鍵字enum以如下語法來聲明,:enum 枚舉類型名字,{名字0,...,名字n};第一個枚舉成員的默認值為整型的0,後續枚舉成員的值在前一個成員上加1 (當然這個是可以自定義成員值的)
枚舉類型名字通常并不真的使用,要用的是在它大括号裡邊的名字,因為它們就是常量符号,它們的類型是int,值則是依次從零到n,如 enum week { Monday,Tuoesday,Wedenday}; 就創建了三個常量,Monday的值是0,Tuoesday是1,Wedenday是2,當需要一些可以可以排列起來的常量值的時候,定義枚舉的意義就是給了這些常量名字。雖然枚舉類型可以當類型使用,但是實際上并不常用,但是如果是有意是排比名字,用枚舉比宏定義方便,枚舉比用好些,因為枚舉有int類型,在C 語言中,枚舉類型是被當做 int 或者 unsigned int 類型來處理的,既然枚舉也是一種數據類型,所以它和基本數據類型一樣也可以對變量進行聲明,枚舉也可以用typedef關鍵字将枚舉類型定義成别名,并利用該别名進行變量聲明
注意:
1、同一個程序中不能定義同名的枚舉類型,不同的枚舉類型中也不能存在同名的命名常量
2、枚舉成員)是常量而不是變量,這個一定要搞清楚,因為枚舉成員的是常量,所以不能對它們賦值,隻能将它們的值賦給其他的變量
3、枚舉類型的定義和變量的聲明分開:如果對枚舉型的變量賦整數值時,需要進行類型轉換
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };//枚舉常量的值是可以在這裡進行自定義的 MON=1
//基本數據類型的賦值 :
int a, b, c;
a = 1;
b = 2;
c = 3;
//使用枚舉賦值 :
enum DAY yesterday, today, tomorrow;//枚舉定義變量
yesterday = MON;
today = TUE;
tomorrow = WED;
// today = (enum DAY) (yesterday 1);//強制類型轉換
// tomorrow = (enum DAY) 30;
//強制類型轉換//tomorrow = 3; //錯誤
枚舉在用switch-case結構中使用非常方便.
//綜合例子:輸入數字查看是星期幾
#include <stdio.h>//枚舉是define的代替 它是一個集合 //和switch連用很方便
int main() {
enum week { Mon = 1,Tues, Wed, Thurs, Fri, Sat, Sun } day; //day可放到這
//enum week day;定義
scanf("%d", &day);
switch (day) {
case Mon: puts("Monday"); break;//1 puts代替printf輸出字符串
case Tues: puts("Tuesday"); break;// 2
case Wed: puts("Wednesday"); break;// 3
case Thurs: puts("Thursday"); break;// 4
case Fri: puts("Friday"); break;// 5
case Sat: puts("Saturday"); break;// 6
case Sun: puts("Sunday"); break;// 7
default: puts("Error!");
}
return 0;
}
枚舉型是預處理指令#define的替代,枚舉和宏其實非常類似,宏在預處理階段将名字替換成對應的值,枚舉在編譯階段将名字替換成對應的值,其中一個枚舉常量的占的字節數為4個字節,恰好和int類型的變量占的字節數相同。
你學會了嘛?
對啦對啦!另外的話為了幫助大家,輕松,高效學習C語言/C ,我給大家分享我收集的資源,從最零基礎開始的教程到C語言項目案例,幫助大家在學習C語言的道路上披荊斬棘!可以來我粉絲群領取哦~
編程學習書籍分享:
編程學習視頻分享:
整理分享(多年學習的源碼、項目實戰視頻、項目筆記,基礎入門教程)最重要的是你可以在群裡面交流提問編程問題哦!
對于C/C 感興趣可以關注小編在後台私信我:【編程交流】一起來學習哦!可以領取一些C/C 的項目學習視頻資料哦!已經設置好了關鍵詞自動回複,自動領取就好了!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!