C語言進階剖析 11 enum sizeof typedef 分析
阿新 • • 發佈:2019-01-14
列舉型別的使用方法
- enum 是 C 語言中的一種自定義型別
- enum 值是可以根據需要自定義的整型值
- 第一個定義的 enum 值預設為 0
- 預設情況下的 enum 值在前一個定義值得基礎上加 1
- enum 型別的變數只能取定義時得離散值
#include <stdio.h>
void code()
{
enum Color
{
GREEN, // 0
RED = 2, // 2
BLUE, // 3
};
// enum Color c = BLUE++; //error: lvalue required as increment operand
enum Color c = BLUE;
printf("%d\n", c);
}
int main()
{
code();
return 0;
}
列舉型別的特殊意義
- enum 中定義的值是 C 語言中真正意義上的常量
- 在工程中 enum 多用於定義整形常量或離散的整型常量
void code() { enum // 無名列舉,用於定義常量 { ARRAY_SIZE = 10, // 定義陣列大小 }; int array[ARRAY_SIZE] = {0}; int i = 0; for(i=0; i< ARRAY_SIZE; i++) { array[i] = i + 1; } }
例項分析 : enum 的使用
#include <stdio.h>
enum
{
ARRAY_SIZE = 10, // 定義常量
};
enum Color
{
RED = 0x00FF0000, // 定義整形離散值
GREEN = 0x0000FF00,
BLUE = 0x000000FF
};
void PrintColor(enum Color c)
{
switch( c ) // 用於 switch case
{
case RED:
printf("Color: RED (0x%08x)\n" , c);
break;
case GREEN:
printf("Color: GREEN (0x%08x)\n", c);
break;
case BLUE:
printf("Color: BLUE (0x%08x)\n", c);
break;
default:
break;
}
}
void InitArray(int array[])
{
int i = 0;
for(i=0; i<ARRAY_SIZE; i++)
{
array[i] = i + 1;
}
}
void PrintArray(int array[])
{
int i = 0;
for(i=0; i<ARRAY_SIZE; i++)
{
printf("%d\n", array[i]);
}
}
int main()
{
enum Color c = GREEN;
int array[ARRAY_SIZE] = {0}; // 用於定義陣列
PrintColor(c);
InitArray(array);
PrintArray(array);
return 0;
}
輸出:
Color: GREEN (0x0000ff00)
1
2
3
4
5
6
7
8
9
10
sizeof 關鍵字的用法
- sizeof 是編譯器的內建指示符
- sizeof 用於計算型別或變數所佔的記憶體大小
- sizeof 的值在編譯期就以確定
- sizeof 用於型別 : sizeof(type)
- sizeof 用於變數 : sizeof(var) 或 sizeof var
void code()
{
int var = 0;
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(var));
printf("%d\n", sizeof var);
}
為 sizeof 關鍵字正名
- sizeof 是 C 語言的內建關鍵字而不是函式
- 在編譯過程中所有的 sizeof 將被具體的數值所替換
- 程式的執行過程與 sizeof 沒有任何關係
○ 下面的程式輸出什麼?
void code()
{
int var = 0;
int size = sizeof(++var);
printf("var = %d, size = %d\n", var, size);
}
程式設計實驗: sizeof 的本質
#include <stdio.h>
double f()
{
printf("Come into Double f...\n");
return 0.0;
}
int main()
{
int var = 0;
int size = sizeof(var++);
printf("var = %d, size = %d\n", var, size);
size = sizeof((int)0.0);
printf("size = %d\n", size);
return 0;
}
輸出:
var = 0, size = 4
size = 8
分析: // 注意 var = 0 ; sizeof(f()) = 8
① sizeof 不是函式,不會在執行時計算變數或型別的值,而是在編譯時,所有的 sizeof 都被具體的值替換。
② sizeof(var++) 在編譯時直接被替換,var++ 得不到執行。
typedef 的意義
面試中…
■ 考官: 你能說說typedef具體的意義嗎?
□ 應聘者: typedef 用於定義一種新的型別…
- typedef 用於給一個已經存在的資料型別重新命名
- typedef 本質上不能產生新的型別
- typedef 重新命名的型別:
○ 可以在 typedef 語句之後定義
○ 不能被 unsigned 和 signed 修飾
○ 用法:typedef type new_name
例項分析: typedef 使用示例
#include <stdio.h>
// --- 定義方式 1
typedef int Int32;
// --- 定義方式 2
struct _tag_point
{
int x;
int y;
};
typedef struct _tag_point Point;
// --- 定義方式 3
typedef struct
{
int lenth;
int array[];
}SoftArray;
// --- 定義方式 4
// 編譯器沒有要求被重新命名的型別必須先定義在可以
typedef struct _tag_list_node ListNode;
struct _tag_list_node
{
ListNode* next;
};
int main()
{
Int32 i = -100; // int
// unsigned Int32 ii = 0; // Error
Point p; // struct _tag_point
SoftArray* sa = NULL;
ListNode* node = NULL; // struct _tag_list_node
}
return 0;
小結
- enum 用於定義離散值型別
- enum 定義的值是真正意義上的常量
- sizeof 是編譯器的內建指示符
- sizeof 不參與程式的執行過程
- typedef 用於給型別重新命名
■ 重新命名的型別可以在 typedef 語句之後
內容參考狄泰軟體學院系列課程,如有侵權,請聯絡作者刪除!感謝~