Categories: C言語

【C言語】変化しない値(定数)を扱う方法を解説

この記事では、C言語で定数を扱う方法を解説します。

定数とは、変化しない値のことを言います。

例えば、よく定数として使われるのが「円周率」や「消費税」です。これらの値は、途中で書き換えられてしまうと計算結果がおかしなことになってしまいます。

なので、書き換えられたくない値を定数として定義することで、そのような凡ミスを事前に防ぐことができます。

それでは、定数の使い方を見ていきましょう!

define(マクロ)を使った定数

define(マクロ)を使うことで定数を扱うことができます。

defineとは、定義した文字列を定数や式で置き換えることができる機能です。

下記のように記述して使用します。

#define マクロ名 定数や式
  • マクロ名は基本的に全て大文字で記述される
  • 文の終わりに ; は付けない

サンプル

それでは、defineで消費税を定数として定義し、本体価格から税込み価格を計算して出力してみます。

#include <stdio.h>

#define TAX 0.1  // 消費税の定数

int main(void){

    // 本体価格
    int price = 100;

    // 税込み価格
    int pay = (int)((1 + TAX) * price);

    printf("本体価格: %d, 税込み価格: %d\n", price, pay);

}

実行結果

価格: 100, 税込み価格: 110

もし、消費税が変わった場合は、TAX の値を書き換えるだけで良いので楽ちん。

ちなみに、TAX を書き換えようとすると以下のようなエラーが発生する。

#include 

#define TAX 0.1  // 消費税の定数

int main(void){

    TAX = 0.08;

}

実行結果

main.c:7:9: error: expression is not assignable
    TAX = 0.08;
    ~~~ ^
1 error generated.

constを使った定数

変数宣言時に const を付けることで、その変数は読み取り専用になり、初期値から変更することができなくなる。

const 型名 変数名 = 初期値;

型名 const 変数名 = 初期値;
【C言語】constを使って変数やポインタ変数を読み取り専用にする方法この記事では、C言語のconstの使い方を解説します。cosntを使うことで変数を書き換え不能にし、読み取り専用にすることができます。また、ポインタ変数に使うことでアドレスを書き換え不能にしたり、アドレス先の値を書き換え不能にできます。それでは、constの使い方を「変数」と「ポインタ変数」に分けて確認していきましょう!...

サンプル

先ほどのサンプルと同じコードを const を使って定義してみます。

#include <stdio.h>

int main(void){

    const float TAX = 0.1;  // 消費税の定数

    // 本体価格
    int price = 100;

    // 税込み価格
    int pay = (int)((1 + TAX) * price);

    printf("本体価格: %d, 税込み価格: %d\n", price, pay);

}

 

実行結果

本体価格: 100, 税込み価格: 110

ちなみに、const を使って宣言した変数を書き換えようとすると以下のようなコンパイルエラーが発生する。

#include <stdio.h>

int main(void){

    const float TAX = 0.1;  // 消費税の定数

    TAX = 0.08;

}

実行結果

main.c:7:9: error: cannot assign to variable 'TAX' with const-qualified type
      'const float'
    TAX = 0.08;
    ~~~ ^
main.c:5:17: note: variable 'TAX' declared const here
    const float TAX = 0.1;  // 消費税の定数
    ~~~~~~~~~~~~^~~~~~~~~
1 error generated.

enumを使った定数

enum を使うことでも定数を扱うことができるが、使えるのは int型 の値のみです。

また、定数として使うというよりどちらかと言えば抽象的な概念をわかりやすく定義するための機能です。

enum は、以下のように定義する。

enum {
    名前1,
    名前2,
    名前3
};

名前1には 0、名前2には 1、名前3には 2 が割り振られる。

以下のように数値を指定することもできる。

enum {
    名前1 = 数値,
    名前2 = 数値,
    名前3 = 数値
};

数値を指定していない箇所には、上の値をインクリメントした値が渡される。

enum {
    名前1 = 10,
    名前2,    // 11
    名前3     // 12
};

サンプル

例えば、性別などの抽象的な概念をマジックナンバーを使わずに定義できます。

#include <stdio.h>

// 性別を表すenum
enum {
    MAN,
    WOMAN
};

int main(void){

    int gender = WOMAN;
 
    if(gender == MAN)
    {
        printf("男性です\n");
    } 
    else if(gender == WOMAN)
    {
        printf("女性です\n");
    }
    
}

実行結果

女性です

ちなみに、enum の値を書き換えようとすると以下のようなコンパイルエラーが発生します。

#include <stdio.h>

// 性別を表すenum
enum {
    MAN,
    WOMAN
};

int main(void){

    MAN = 10;
    
}

実行結果

main.c:11:9: error: expression is not assignable
    MAN = 10;
    ~~~ ^
1 error generated.
ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago