1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【C言語】定数と列挙体(enum)

Last updated at Posted at 2024-11-06

定数

マクロ定義(非推奨)

用途 : プログラム内で頻繫に使用される文字列を、あらかじめ定義した内容に置換する

  • 定義
#define マクロ名 値 または 式
  • 注意点
example.c
#include <stdio.h>

#define ONE 1
#define TWO 2
#define ONE_PLUS_TWO ONE + TWO

int main()
{
    // ONE(1) + TWO(2) * 4を出力する
    printf("%d", ONE_PLUS_TWO * 4);
    
    // 4 * ONE(1) + TWO(2)を出力する
    printf("%d", 4 * ONE_PLUS_TWO);

    return 0;
}

以上のように、内容が置換されるだけで、計算結果が定義されているわけではない。
結果を返したい場合は、

#define マクロ名 (値) または (式)

で計算の優先順位を上げる。

const定数

用途 : コンパイル時に宣言した値を書き換えることができなくする

  • 宣言
const 型 変数名 = ;

constexpr定数(C++11以上のみ)

用途 : コンパイル時に宣言した値を書き換えることができなくする
constとの比較 : 柔軟性の向上

  • 宣言
constexpr 型 変数名 = ;

readonly定数(C#のみ)

用途 : インスタンスの初期化時に宣言した値を書き換えることができなくする
constとの比較 : バージョニング問題の回避、柔軟性の向上

  • 宣言
readonly 型 変数名 = ;

フローチャート

列挙体を効果的に活用するためには、プログラムの流れを可視化し、
ロジックを整理する能力が求められます。
そこで、列挙型を学ぶ前に、フローチャートを簡易的に解説します。

例)カップラーメンをつくる
※□は次へ進む、△は条件であり、達成されたら次へ進む

□カップラーメンを用意する
□ケトルに水を入れる
□湯を沸かす
□蓋を半分までめくり、かやくを入れる
□沸いた湯を入れる
△湯を入れた時間>3分
完成

列挙体

用途 : 複数の異なる定数を一つの集合として定義する

enum

  • 宣言
enum 列挙体名
{
    列挙定数1,
    列挙定数2,
    .
    .
    .
};
列挙体名 変数名;

列挙定数には0から自動的に数字が割り振られる。

  • 値を特別に変更したい場合
列挙定数 = 数字,
  • 列挙定数の取り出し
変数名.列挙定数1

※列挙体の中(メンバ)を指定する場合、
 繋ぐために.(ドット)を用いる

命名規則

列挙体名はアッパーキャメルケースが推奨される。
また、列挙定数は全て大文字が推奨。
※アッパーキャメルケース
 単語の先頭を大文字にしてつなげる表記方法(キャメルケース)の分類のひとつ。
 最初の文字を大文字にしたキャメルケースのこと。

enum class(C++11以上のみ)

enumとの違い : 変数をint型の変数に代入しても 暗黙的な型変換 が行われなくなった

enum class 列挙体名
{
    列挙定数1,
    列挙定数2,
    .
    .
    .
};
列挙体名 変数名;

switch文

  • int型で管理する場合
example_i.c
#include <stdio.h>

int main()
{
    int tmp = 数字;
    switch(tmp)
    {
    case 0:
        処理
        break;
    case 1:
        処理
        break;
        .
        .
        .
    default: // ≒条件分岐のelse(書かなくても良い)
        処理
        break;
    }

    return 0;
}
  • 列挙体(enum)で管理する場合
example_enum.c
#include <stdio.h>

int main()
{
    // 列挙体の宣言
    enum Week
    {
        SUNDAY,    // 日曜日
        MONDAY,    // 月曜日
        TUESDAY,   // 火曜日
        WEDNESDAY, // 水曜日
        THURSDAY,  // 木曜日
        FRIDAY,    // 金曜日
        SATURDAY,  // 土曜日
        NONE,      // 未設定
    };
    Week week;

    week = 列挙定数のどれか;
    switch(week)
    {
    case SUNDAY:
        printf("日曜日");
        break;
    case MONDAY:
        printf("月曜日");
        break;
    case TUESDAY:
        printf("火曜日");
        break;
    case WEDNESDAY:
        printf("水曜日");
        break;
    case THURSDAY:
        printf("木曜日");
        break;
    case FRIDAY:
        printf("金曜日");
        break;
    case SATURDAY:
        printf("土曜日");
        break;
    default:
        printf("未設定です");
        break;
    }

    return 0;
}
1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?