C言語で列挙型を使用する方法

How Use Enum C Language



Cプログラミング言語の列挙型プログラムは、積分定数値を定義するために使用されます。これは、クリーンで読みやすいプログラムを作成するのに非常に役立ちます。プログラマーは通常、列挙型を使用してプログラム内の名前付き積分定数を定義し、ソフトウェアの可読性と保守性を向上させます。この記事では、列挙型について詳しく説明します。

構文

列挙型 <列挙型名>> {{
Enumeration_Constant_Element-1
Enumeration_Constant_Element-2
Enumeration_Constant_Element-3
……........。
Enumeration_Constant_Element-NS
};

Enumeration_Constant_Element-1のデフォルト値は0、Enumeration_Constant_Element-2の値は1、Enumeration_Constant_Element-3の値は2、Enumeration_Constant_Element-nの値は(n-1)です。







列挙型の詳細

ここで、列挙型を定義する構文がわかったので、例を見てみましょう。



列挙型エラー{{
IO_ERROR
DISK_ERROR
ネットワークエラー
};

列挙型を定義するには、enumキーワードを常に使用する必要があります。したがって、列挙型を定義する場合は常に、の前にenumキーワードを使用する必要があります。 enumキーワードの後に​​、有効な識別子を使用してを定義する必要があります。



上記の例では、コンパイラはIO_ERRORを整数値:0に、DISK_ERRORを整数値:1に、NETWORK_ERRORを整数値:2に割り当てます。デフォルトでは、最初の列挙型要素には常に値0が割り当てられ、次の列挙型要素には常に値0が割り当てられます。 enum-elementには値1が割り当てられ、以下同様に続きます。





このデフォルトの動作は、必要に応じて、次のように定数積分値を明示的に割り当てることで変更できます。

列挙型エラー{{
IO_ERROR= 2
DISK_ERROR
ネットワークエラー= 8
PRINT_ERROR
};

この場合、IO_ERRORはプログラマーによって値2に明示的に割り当てられ、DISK_ERRORはコンパイラーによって値3に割り当てられ、NETWORK_ERRORはプログラマーによって値8に明示的に割り当てられ、PRINT_ERRORは次の値に割り当てられます。コンパイラーによる前の列挙型要素NETWORK_ERROR(つまり、9)の整数値。



これで、Cでユーザー定義の列挙型を定義する方法を理解できました。列挙型の変数を宣言することは可能ですか(整数型の変数を宣言できるため)?はい、そうです! enum変数は次のように宣言できます。

列挙型エラーHw_Error;

ここでも、enumはここでのキーワード、Errorは列挙型、Hw_Errorは列挙変数です。

次に、列挙型のさまざまな使用法を理解するために、次の例を見ていきます。

  • 例1:デフォルトの列挙型定義の使用法
  • 例2:カスタム列挙型定義の使用法
  • 例3:定数式を使用した列挙型の定義
  • 例4:列挙型スコープ

例1:デフォルトの列挙型定義の使用法

この例では、デフォルトの定数値を使用して列挙型を定義する方法を学習します。コンパイラは、列挙型要素へのデフォルト値の割り当てを処理します。以下に、サンプルプログラムと対応する出力を示します。

#含む

/ *列挙型を定義します* /
列挙型エラー{{
IO_ERROR
DISK_ERROR
ネットワークエラー
};

int主要(()。
{{
列挙型エラーHw_Error; / *列挙型変数の作成* /

printf (('Hw_ErrorをIO_ERRORに設定するNS')。;
Hw_Error=IO_ERROR;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

printf (('NSHw_ErrorをDISK_ERRORに設定するNS')。;
Hw_Error=DISK_ERROR;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

printf (('NSHw_ErrorをNETWORK_ERRORに設定するNS')。;
Hw_Error=ネットワークエラー;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

戻る 0;
}

https://lh6.googleusercontent.com/0CHtUqkuIA-okDEPI0_5fZLU6lZ6Exz6DK4uUr63k5Ros863eqC-HmrvZ_LZBKbEvqeCVMCsnvXXhfrYJrBaxxfZBWoiMOhzApzXey4uUr63

例2:カスタム列挙型定義の使用法

この例では、カスタム定数値を使用して列挙型を定義する方法を学習します。また、この例は、カスタム定数の初期化を任意のランダムな順序で実行する方法を理解するのに役立ちます。この例では、1の定数値を明示的に定義しています。NSおよび3rd列挙型要素(つまり、それぞれIO_ERRORとNETWORK_ERROR)ですが、2の明示的な初期化をスキップしましたNSおよび4NS要素。デフォルト値を2に割り当てるのは、コンパイラの責任です。NSおよび4NS列挙型要素(つまり、それぞれDISK_ERRORとPRINT_ERROR)。 DISK_ERRORは値3に割り当てられ、PRINT_ERRORは値9に割り当てられます。以下に、サンプルプログラムと出力を示します。

#含む

/ *列挙型を定義します-カスタム初期化* /
列挙型エラー{{
IO_ERROR= 2
DISK_ERROR
ネットワークエラー= 8
PRINT_ERROR
};

int主要(()。
{{

/ *列挙型変数を宣言します* /
列挙型エラーHw_Error;

printf (('Hw_ErrorをIO_ERRORに設定するNS')。;
Hw_Error=IO_ERROR;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

printf (('NSHw_ErrorをDISK_ERRORに設定するNS')。;
Hw_Error=DISK_ERROR;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

printf (('NSHw_ErrorをNETWORK_ERRORに設定するNS')。;
Hw_Error=ネットワークエラー;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

printf (('NSHw_ErrorをPRINT_ERRORに設定するNS')。;
Hw_Error=PRINT_ERROR;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

戻る 0;
}

https://lh6.googleusercontent.com/hKtv00Hj7iPnnlNhC7mu1v7hzPhB64C9nyHwjB6oQgyCyEwOgiLSYWDOxvQCDrhumn4IzqhkN4qF9HcuGZ9thqlBLy6wzxvl2F-FUwj

例3:定数式を使用した列挙型の定義

この例では、定数式を使用して列挙型要素の定数値を定義する方法を学習します。

#含む

/ *列挙型を定義します-定数式を使用したカスタム初期化
ここでは、次の場合に定数式が使用されています。
NS。 IO_ERRORおよび
NS。ネットワークエラー
これは、列挙型要素を定義する珍しい方法です。しかし、これは
プログラムは、列挙型要素の初期化のこの方法がcで可能であることを示しています。
* /


列挙型エラー{{
IO_ERROR= 1 + 2 * 3 + 4
DISK_ERROR
ネットワークエラー= 2 == 2
PRINT_ERROR
};

int主要(()。
{{

/ *列挙型変数を宣言します* /
列挙型エラーHw_Error;

printf (('Hw_ErrorをIO_ERRORに設定するNS')。;
Hw_Error=IO_ERROR;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

printf (('NSHw_ErrorをDISK_ERRORに設定するNS')。;
Hw_Error=DISK_ERROR;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

printf (('NSHw_ErrorをNETWORK_ERRORに設定するNS')。;
Hw_Error=ネットワークエラー;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

printf (('NSHw_ErrorをPRINT_ERRORに設定するNS')。;
Hw_Error=PRINT_ERROR;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

戻る 0;
}

https://lh4.googleusercontent.com/9FAbPOnM95LiP_UQvg40oHSW4sv34aqpFgasbHMiy06Z_rKEom81TuMCVsfxWaZedtQOMEQx7ef_5qEfRVcNrUvhitDzOcTvOilby4hUvhitDzOc

例4:列挙型スコープ

この例では、列挙型に対してスコープルールがどのように機能するかを学習します。列挙型の代わりにMACRO(#define)を使用して定数を定義することもできますが、スコープ規則はMACROでは機能しません。

#含む

int主要(()。
{{

/ *列挙型を定義します* /
列挙型Error_1{{
IO_ERROR= 10
DISK_ERROR
ネットワークエラー= 3
PRINT_ERROR
};


{{

/ *内部スコープで列挙型を定義します* /
列挙型Error_1{{
IO_ERROR= 20
DISK_ERROR
ネットワークエラー= 35
PRINT_ERROR
};

/ *列挙型変数を宣言します* /
列挙型Error_1 Hw_Error;
printf (('Hw_ErrorをIO_ERRORに設定するNS')。;
Hw_Error=IO_ERROR;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

printf (('NSHw_ErrorをDISK_ERRORに設定するNS')。;
Hw_Error=DISK_ERROR;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

printf (('NSHw_ErrorをNETWORK_ERRORに設定するNS')。;
Hw_Error=ネットワークエラー;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;

printf (('NSHw_ErrorをPRINT_ERRORに設定するNS')。;
Hw_Error=PRINT_ERROR;
printf (('Hw_Errorの値=%dNS'Hw_Error)。;
}
戻る 0;
}

列挙型とマクロの比較

列挙型 大きい
スコープ規則は列挙型に適用されます。 スコープルールはマクロには適用されません。
デフォルトの列挙値の割り当ては自動的に行われます。

列挙型は、多数の定数を定義するのに非常に役立ちます。コンパイラーは、デフォルトの定数値の初期化を行います。

マクロ定数値は、プログラマーが常に明示的に言及する必要があります。

プログラマーはマクロを定義する際に常に各定数値を手動で定義する必要があるため、これは多数の定数にとって面倒なプロセスになる可能性があります。

結論

Cの列挙型プログラムは、プログラマーが列挙型の代わりに常にマクロを使用できるため、スタンドアロンプ​​ログラムまたは小規模プロジェクトのオプションの方法と見なすことができます。ただし、経験豊富なプログラマーは、大規模なソフトウェア開発プロジェクトでマクロよりも列挙型を使用する傾向があります。これは、クリーンで読みやすいプログラムを作成するのに役立ちます。