tft每日頭條

 > 生活

 > c語言正确使用枚舉類型

c語言正确使用枚舉類型

生活 更新时间:2025-02-12 04:12:48

c語言正确使用枚舉類型(零基礎學C語言知識總結八)1

1、#define宏定義

以#号開頭的都是編譯預處理指令,它們不是C語言的成分,但是C程序離不開它們,#define用來定義一個宏,程序在預處理階段将用define定義的來内容進行了替換。因此在程序運行時,常量表中并沒有用define定義的常量,系統不為它分配内存。define定義的常量,預處理時隻是直接進行了替換,,它用來将一個标識符定義為一個字符串,該标識符被稱為宏名,被定義的字符串稱為替換文本。,因此在編譯時它不對宏的定義進行檢查,作用域不影響對常量的訪問 。它的常量值隻能是字符串或數字。 該命令有兩種格式:一種是簡單的常量宏定義, 另一種是帶參數的宏定義。

c語言正确使用枚舉類型(零基礎學C語言知識總結八)2

不帶參數的宏:#define< 名字 >< 值 > 要注意,沒有結尾的分号,因為不是C的語句,名字必須是一個單詞,值可以是各種東西,宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這隻是一種簡單的代換,字符串中可以含任何字符,可以是常數,也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,隻能在編譯已被宏展開後的源程序時發現。

注意.宏定義不是說明或語句,在行末不必加分号,如加上分号則連分号也一起置換。宏定義其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令

帶參宏定義的一般形式為:#define 宏名(形參表)字符串,也是沒有結尾的分号,可以帶多個參數 ,#define NB(a,b)((a)>(b)?(b):(a)), 也可以組合(嵌套)使用其他宏,注意 帶參數宏的原則 一切都要有括号,參數出現的每個地方都要有括号。帶參數的宏在大型的程序的代碼中使用非常普遍,在#和##這兩個運算符的幫助下可以很複雜,如“産生函數”,但是有些宏會被inline函數代替(C 的函數)

使用宏好處:提高運行效。

定義的标識符不占内存,隻是一個臨時的符号,預編譯後這個符号就不存在了。在簡單的程序使用帶參數的宏定義可完成函數調用的功能,又能減少系統開銷,提高運行效率。正如C語言中所講,函數的使用可以使程序更加模塊化,便于組織,而且可重複利用。

“方便程序的修改”。使用宏定義可以用宏代替一個在程序中經常使用的常量。注意,是“經常”使用的。這樣,當需要改變這個常量的值時,就不需要對整個程序一個一個進行修改,隻需修改宏定義中的常量即可。且當常量比較長時,使用宏就可以用較短的有意義的标識符來代替它,這樣編程的時候就會更方便,不容易出錯。因此,宏定義的優點就是方便和易于維護。

//例子:/求球的體積​​​​

#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;

}

2、enum枚舉

枚舉型是一個集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗号,隔開。它是一種用戶定義的數據類型,它用關鍵字enum以如下語法來聲明,:enum 枚舉類型名字,{名字0,...,名字n};第一個枚舉成員的默認值為整型的0,後續枚舉成員的值在前一個成員上加1 (當然這個是可以自定義成員值的)

c語言正确使用枚舉類型(零基礎學C語言知識總結八)3

枚舉類型名字通常并不真的使用,要用的是在它大括号裡邊的名字,因為它們就是常量符号,它們的類型是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語言知識總結八)4

編程學習視頻分享:

c語言正确使用枚舉類型(零基礎學C語言知識總結八)5

整理分享(多年學習的源碼、項目實戰視頻、項目筆記,基礎入門教程)最重要的是你可以在群裡面交流提問編程問題哦!

對于C/C 感興趣可以關注小編在後台私信我:【編程交流】一起來學習哦!可以領取一些C/C 的項目學習視頻資料哦!已經設置好了關鍵詞自動回複,自動領取就好了!

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved