コンピュータプログラミングにおける「マジックナンバー」の使用について人々が話すとき、それはどういう意味ですか?
11 に答える
マジック ナンバーとは、知識がほとんどない人にはすぐにはわからない、コード内の任意の数字です。
たとえば、次のコードは次のとおりです。
sz = sz + 729;
その中にマジックナンバーがあり、次のように書く方がはるかに良いでしょう:
sz = sz + CAPACITY_INCREMENT;
いくつかの極端な見解では、-1、0、および 1 以外の数字をコードに含めるべきではないと述べていますが、私は 24、1440、86400、3.1415、2.71828、および 1.414 を即座に認識できるため、やや独断的でない見解を好みます。あなたの知識。
ただし、1 日が 1440 分であることはわかっていても、識別子を使用すると検索がMINS_PER_DAY
はるかに簡単になるため、おそらく識別子を使用します。上記の容量の増分も 1440 ではなく、間違った値を変更してしまうと誰が言えますか? これは特に低い数値に当てはまります。37197 を二重に使用する可能性は比較的低く、5 を複数の用途に使用する可能性はかなり高くなります。
識別子を使用すると、700 個のソース ファイルすべてを調べて、容量の増分が変更されたときに変更729
する必要がなくなります。730
次の 1 行を変更するだけです。
#define CAPACITY_INCREMENT 729
に:
#define CAPACITY_INCREMENT 730
ロットを再コンパイルします。
これを、コードから実際の数値を削除したからといって、変更できると単純な人々が考えた結果である魔法の定数とは対照的です。
x = x + 4;
に:
#define FOUR 4
x = x + FOUR;
これにより、コードに余分な情報がまったく追加されず、時間の無駄になります。
「マジック ナンバー」は、次のようなステートメントに表示される数字です。
if days == 365
1 年が 365 日であることを知らなかったと仮定すると、このステートメントは無意味であることがわかります。したがって、すべての「マジック」ナンバー (プログラムで何らかの意味を持つ数字) を定数に割り当てることをお勧めします。
DAYS_IN_A_YEAR = 365
そしてそれ以降は、代わりにそれと比較してください。読みやすくなり、地球がずれてしまった場合に 1 日余分に得られた場合...簡単に変更できます (他の数値は変更される可能性が高くなる可能性があります)。
There's more than one meaning. The one given by most answers already (an arbitrary unnamed number) is a very common one, and the only thing I'll say about that is that some people go to the extreme of defining...
#define ZERO 0
#define ONE 1
If you do this, I will hunt you down and show no mercy.
Another kind of magic number, though, is used in file formats. It's just a value included as typically the first thing in the file which helps identify the file format, the version of the file format and/or the endian-ness of the particular file.
For example, you might have a magic number of 0x12345678. If you see that magic number, it's a fair guess you're seeing a file of the correct format. If you see, on the other hand, 0x78563412, it's a fair guess that you're seeing an endian-swapped version of the same file format.
The term "magic number" gets abused a bit, though, referring to almost anything that identifies a file format - including quite long ASCII strings in the header.
ウィキペディアはあなたの友達です (マジック ナンバーの記事)
これまでの回答のほとんどは、マジックナンバーを自己記述的ではない定数として説明しています。私自身少し「昔ながらの」プログラマーだったので、昔はマジック ナンバーを、コードの動作に影響を与える何らかの特別な目的が割り当てられている任意の定数であると説明していました。たとえば、数値 999999 または MAX_INT またはその他の完全に任意のもの。
マジック ナンバーの大きな問題は、その目的が簡単に忘れられたり、別の完全に合理的なコンテキストで値が使用されたりすることです。
粗雑でひどく不自然な例として:
while (int i != 99999)
{
DoSomeCleverCalculationBasedOnTheValueOf(i);
if (escapeConditionReached)
{
i = 99999;
}
}
定数が使用されているか名前が付けられていないという事実は、実際には問題ではありません。私のひどい例の場合、値は動作に影響しますが、ループ中に「i」の値を変更する必要がある場合はどうなるでしょうか?
上記の例では明らかに、ループを終了するためにマジック ナンバーは必要ありません。それを break ステートメントに置き換えることができます。これがマジック ナンバーの本当の問題です。マジック ナンバーはコーディングへの怠惰なアプローチであり、必ず失敗する可能性が低く、時間の経過とともに意味を失う可能性が低いものに常に置き換えることができます。
アプリケーション自体以外の誰にもすぐに明らかな意味を持たないもの。
if (foo == 3) {
// do something
} else if (foo == 4) {
// delete all users
}
マジック ナンバーは、プログラムを特別な方法で動作させる特定の変数の特別な値です。
たとえば、通信ライブラリは Timeout パラメータを取り、無限のタイムアウトを示すマジック ナンバー「-1」を定義できます。
マジック ナンバーという用語は通常、コード内の数値定数を表すために使用されます。番号はそれ以上の説明なしで表示されるため、その意味は難解です。
名前付き定数を使用すると、マジック ナンバーの使用を回避できます。
何らかの識別子または変数によって定義されていない 0 または 1 以外の数値を計算に使用する (これにより、数値を 1 か所で変更することにより、複数の場所で数値を簡単に変更できるだけでなく、その数値が何であるかが読者に明確になります)用です)。
少し平凡に思えるかもしれませんが、すべてのプログラミング言語には少なくとも 1 つの実際のマジック ナンバーがあります。
0
私は、事実上すべてのプログラマーの魔法の杖の矢筒でそれらすべてを支配することが魔法の杖であると主張します。
FALSE は必ず 0 です TRUE はそうではありません (FALSE) が、必ずしも 1 であるとは限りません! -1 (0xFFFF) の可能性があります
NULL は必然的に 0 (ポインタ) であり、ほとんどのコンパイラは、型チェックが完全に狂っていない限り、それを許可します。
0 は、配列要素のベース インデックスです。次に、for(i = 0; i < 32; i++) を便利にコーディングして、「i」が基数 (0) から始まり、32-1 までインクリメントして停止することを期待できます... の 32 番目のメンバー配列、または何でも。
0 は、多くのプログラミング言語文字列の末尾です。「ここで停止」の値。
0 も同様に、「文字列を効率的に移動する」ために X86 命令に組み込まれています。多くのマイクロ秒を節約します。
0 は、プログラマーがルーチンの実行で「何も問題がなかった」ことを示すためによく使用します。これは「例外ではない」コード値です。これを使用して、スローされた例外がないことを示すことができます。
ゼロは、アクティブ セルの色を明るいピンクではなく紫に変更するなど、まったく些細なことを行うのに必要な作業量に対して、プログラマーによって最もよく与えられる答えです。「ゼロ、ゼロのように!」
0 は、達成したいプログラムのバグの数です。説明されていない例外 0 個、終了していないループ 0 個、実際に使用できない再帰経路 0 個。0 は、労働、ガールフレンド (またはボーイフレンド) の「問題」、お粗末なレストランでの経験、および自分の車の一般的な特異性をプログラミングする際に達成しようとしている漸近線です。
はい、0 は確かにマジック ナンバーです。他のどの値よりもはるかに魔法です。何もありません...ええと、近づいています。
rlynch@datalyser.com
簡単に言えば、マジック ナンバーは 3 桁の数字で、最初の 2 桁の平方和が 3 桁目の数字と等しくなります。Ex-202 として、2*2 + 0*0 = 2*2。ここで、Java で WAP を使用して整数を受け入れ、それがマジック ナンバーかどうかを出力します。