1

たとえば、C/C++ で次のコードを考えてみましょう。

int foo[] = {0, 0, 0, 0};

魔法の数字はありませんよね?
これに相当する Python は次のようになります。

foo = [0, 0, 0, 0]

まだ魔法の数字はありません。
しかし、Python では、同じことを次のように書くことができます。

foo = [0] * 4

そして今、私たちは魔法の数を持っています. それとも私たちですか?
これと他の同様のものがこれらの言語や他の言語に存在すると推測しています。

4

5 に答える 5

11

すべての数値が魔法の定数というわけではありません。その理由4と 4 つ0が (どの言語でも) マジック ナンバーである理由は、その数字が他の数字ではなく、なぜその数字であるかが完全に不明だからです。4

たとえば、よく知られている 6 面ダイスを使ってプレイされるゲームのコンテキストでは、

def roll_die():
    return random.randint(1,6)

このコードにはマジック ナンバーはありません。なぜなら、数字がどこから来たのかを簡単に確認できるからです。

一方で、他のプログラマーが知っている数字を推測するのは難しい場合があります。たとえば、誰もがデッキのカード枚数を知っているわけではないので、そこで名前付き定数を使用する方が理にかなっています。

数字が「魔法」であるかどうかは完全に文脈に依存し、言語とは何の関係もありません。疑わしい場合は、安全のために定数に名前を付けてください。

于 2011-03-16T00:27:48.300 に答える
5

(C または C++ の場合) との違いは次のとおりです。

int foo[4] = {0};

?

これらすべての場合において、配列のサイズは魔法の数です。

于 2011-03-16T00:07:22.147 に答える
0

以下のコードを参照してください。交流言語機能です。

  int arr[] = { [0 ... 4]=3,[7]=7,[8 ... 12]=12,[15]=0};

と同じです

int arr[] = { 3, 3, 3, 3, 3, 0, 0, 7, 12, 12, 12, 12, 12, 0, 0, 0 };

于 2011-03-16T04:31:49.200 に答える
0

私が理解している方法では、マジックナンバーはドメイン値です(計算で使用され、マッピング要素のインデックス)。それらの考え方は、どの言語でも一貫しています。あなたの例では、これらの配列の目的によって異なります。

于 2011-03-16T00:08:58.540 に答える
-1

あなたの質問が示すのは、「マジック ナンバー」の概念と、プログラムで「マジック ナンバー」を使用することに対するルールが完全にばかげているということだけです。マジック ナンバーに対する規則は、自分が何をしているのかを理解していない人々による、一致しなければならない、または相互に依存する値を複数の場所にハードコーディングすることに対する、より健全な規則の不十分な概算です。たとえば、次のコードは、バッファー長がプログラムまたは実世界の他のものと一致する必要がない限り、完全に合理的です。

char buf[100];
snprintf(buf, sizeof buf, ...);

しかし、このコードは非常に悪いです:

char buf[100];
snprintf(buf, 100, ...);

もちろん、現実の世界では、おそらく特定のサイズの整数を出力するために必要な最大桁数など、バッファサイズを一致させたいことがあります。この場合、次のようなものが必要になる場合があります。

char buf[3*sizeof(int)+3];
snprintf(buf, sizeof buf, ...);

そして、CHAR_BIT変数であると考える場合は、 3 を の式に置き換えたいと思うかもしれませんCHAR_BIT。いずれにせよ、式に現れる定数は「邪悪な魔法の数字」ではありません。

あなたの例では、配列の次元が他の変数に依存している場合、3 つの配列定義はすべて悪い習慣です。しかし、次元 4 があなたがやっていることの基本であるなら、私はそれが間違っているとは思いません。

もちろん、あなたがしていることは、コードの存続期間中に変更されることがありますが、それがドキュメントの目的です。コードは、ある程度の変更なしに将来起こり得る目的の変更を処理することは期待できません。元の目的と契約が何であるかを文書化する限り、それらを変更した人がコードの部分を見つけるのは難しくありません。変更する必要があります。

于 2011-03-16T00:51:09.137 に答える