第1章 「やさしい入門」
1.4 記号定数

2020年11月7日

プログラム内で直接数字を記入すると、可読性が落ちます。
前項では、華氏0~360の摂氏を20度ステップで求めました。

これを例えば10度ステップにしたい場合、自身で修正する場合は問題無いのですが他人のコードを修正する場合、まずソースコードの理解から始める必要があります。
これを避ける為、C言語では定数宣言の機能があります。

define

まずは「プログラミング言語C」ベースのサンプルをご覧下さい。


for文で直接数字が書かれていた0,300,20が判りやすい単語で表現されていますね。
これなら後から他者がコードを見ても理解しやすいでしょう。これを可読性と言います。

defineの問題点

可読性が向上し便利なdefine宣言ですが、実は欠点もあります。
まずは次のサンプルをコンパイルしてみて下さい。


warningは出ると思いますが、エラー無しでコンパイルは通ってしまいます。
実行結果はこのようになります。10ステップづつ進んでいますね。

これは6行目の#define STEP 20が13行目の#define STEP 20で上書きされてしまったからです。
今回のように短いソースファイルでは見通しが良いのでこのようなミスはあり得ませんが、大きなソースファイルではどうでしょう?
さらに時間が経過してから修正する場合や、他の人が修正することを考えるとdefienはあまりおすすめ出来ません。

※defineはコンパイル制御など他の使い方もありますが、ここでは定数の置き換えとして説明しています。

const定数

defienを定数定義に利用するとこのような不便な点がありますので、const利用をおすすめします。
まずはサンプルプログラムを見て下さい。

こちらのファイルの拡張子はcppとしてコンパイルして下さい。

※main()の前のintも忘れないように。

解説

まず最初にお伝えします。
ソースファイルの拡張子をcppにしました。
実は拡張子をcppにするとコンパイラーはC言語では無くC++言語として認識します。
C++、もしかすると聞いたことがあるかも知れません。
C言語の上位版でオブジェクト指向言語になります。
オブジェクト指向言語だとか上位版だとか聞くと身構えてしまいますが、オブジェクト指向部分は使わずに上位の便利な機能だけを使うためにcppとしています。

constの機能も同様にc言語ではサポートされていません。
特に難しいこともありませんので拡張子をcppにしてどんどん使いましょう。

ここからが本当の解説です。

constexpr static double LOWER = 0;

皆様が知っている宣言 double LOWER = 0;
の前に何やら付いています。

constexpr static は、変更出来ない変数を宣言しています。
つまりこの文は、変更出来ないdouble型の変数LOWERを初期値0で宣言した事になります。

以降は、普通の変数のように利用出来ますが、代入は出来ません。
結局#define定義と同じように利用することができるのです。

今回は#defineとの違いがあまり良くわからないと思いますが、今後学習を進めていくに従い違いが明確になります。
最初は疑問かも知れませんがconstを使った定数定義になれておきましょう

今回はここまで
 

※本プログラム教室はK&Rの「プログラミング言語C」をベースに進めています。