constの使い道が分かりません!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
まるまる6734

constの使い道が分かりません!

#1

投稿記事 by まるまる6734 » 6年前

コード:

const int XXX = 500
constを使用して定数として定義するプログラムを目にするのですが、なぜ定義するのでしょうか?
必要とあればその都度かけば良いものではないのでしょうか?(今回だったら500って書けば良い)
constを使う意味をサンプルコード共に教えてくださるとありがたいです。

maru
記事: 150
登録日時: 13年前

Re: constの使い道が分かりません!

#2

投稿記事 by maru » 6年前

Google君に「C マジックナンバー」と聞いてみたら、
「次のような理由で、マジックナンバーはプログラム中に含まれないことが好ましいとされる。
・その数値の持つ意味がわかりづらい。
・数値を変更する場合に、複数の箇所を変更しなければならない可能性がある。 」
という答えが得られました。
まるまる6734 さんが書きました:constを使用して定数として定義するプログラムを目にするのですが、なぜ定義するのでしょうか?
まさにマジックナンバーを避けるために定数を定義するんです。
まるまる6734 さんが書きました:必要とあればその都度かけば良いものではないのでしょうか?(今回だったら500って書けば良い)
500という値を変更したい時、プログラム中にある500を全部探し出して変更するのでしょうか?(まあエディタがやってくれるので手間はかかりませんが)
そして、その探しだした500という値は本当に変更していいんでしょうか?(別の意味かもしれない)
オフトピック
まるまる6734 さんが書きました:

コード:

const int XXX = 500
通常は意味のある変数名にして、コメントをつけると思うのだが...
文末のセミコロンもないし。

よもやま
記事: 68
登録日時: 8年前
連絡を取る:

Re: constの使い道が分かりません!

#3

投稿記事 by よもやま » 6年前

コード:

//温度センサー制御上限値
const float MaxTemperature = 95.0;
オフトピック
#defineの使用例をafx.h(MFC)より一部引用

コード:

#ifdef _AFXDLL
#define DECLARE_DYNAMIC(class_name) \
protected: \
	static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
	static const CRuntimeClass class##class_name; \
	static CRuntimeClass* PASCAL GetThisClass(); \
	virtual CRuntimeClass* GetRuntimeClass() const; \

#define _DECLARE_DYNAMIC(class_name) \
protected: \
	static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
	static CRuntimeClass class##class_name; \
	static CRuntimeClass* PASCAL GetThisClass(); \
	virtual CRuntimeClass* GetRuntimeClass() const; \

#else
#define DECLARE_DYNAMIC(class_name) \
public: \
	static const CRuntimeClass class##class_name; \
	virtual CRuntimeClass* GetRuntimeClass() const; \

#define _DECLARE_DYNAMIC(class_name) \
public: \
	static CRuntimeClass class##class_name; \
	virtual CRuntimeClass* GetRuntimeClass() const; \

#endif


かずま

Re: constの使い道が分かりません!

#4

投稿記事 by かずま » 6年前

const の使い道ですか?

まず、マジックナンバーを避けるためというのがあります。
でも、マジックナンバーを避けるために const が必要でしょうか?

int XXX = 500; または #define XXX 500 としても、
マジックナンバーは回避できます。

次の例では const を付けない int は良くないことになります。

コード:

int XXX = 500;
char buf[XXX];       // C:*,  C++:エラー

const int XXX = 500;
char buf[XXX];       // C:*,  C++:OK

#define XXX 500
char buf[XXX];       // C:OK, C++:OK

*: C99 の可変長配列をコンパイラが実装していると OK、そうでないとエラー
マジックナンバーを回避するには #define が一番いいように思えます。
ヘッダファイルに記述して、複数のファイルからインクルードされても
エラーになりません。

複数のファイルに const int XXX = 500; があると、
C++ ではエラーになりませんが、C では多重定義のエラーです。

const が #define よりいいところは、
変数と同様に、スコープを局所的にできるとか、
単項&演算子でアドレスを取得できるところでしょうか。

返信

“C言語何でも質問掲示板” へ戻る