質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Q&A

解決済

4回答

8973閲覧

マジックナンバーとはなんですか??

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

0グッド

0クリップ

投稿2016/09/21 11:31

マジックナンバーとは何でしょうか?

C言語でプログラムを作って見ました。

readelf -a hello | head
というコマンドを打つと一番最初の方に出てくる番号ですよね??

実際にやってみると 16進数の数字が16個出てきますね。

Linuxカーネル内に存在するelf.hを見てフォーマットを見てみました。
これはOS側が適当に割り当てる数字ではないのですか??

Googleで調べると、「マジックナンバー = 悪」、「マジックナンバー、やってはいけない」とかありますが、どういうことでしょう??

どなたか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

readelfなどで確認できるファイルを識別するための番号を意味するマジックナンバーは下記になります。
マジックナンバー (フォーマット識別子)

プログラミングで避けた方が良いと言われているべたリテラルを示すマジックナンバーは下記になります。
マジックナンバー (プログラム)

ということで、名前は同じでも全く異なる物です。他にもプロ野球などであと何勝したら優勝になるかという数もマジックナンバーと言われますね。

投稿2016/09/21 12:57

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

archiver

2016/09/21 13:01

3つ目のも確かに「マジックナンバー」ですね(笑)。 (これは浮かんできませんでした…)
strike1217

2016/09/22 00:20

ありがとうございます。
guest

0

ベストアンサー

マジックナンバーとは、ソースコードにベタ打ちされた数値のことです(場合によっては文字列も含みますが)。

練習等、短め(というか小さめ)のコードであれば、さほど問題になりませんが、これが生産物となると話は別です。
プログラムは「仕様」を元にコーディングされていきます。その際、定数(数値や文字列)なども規定されるわけですが、そうした定数はマクロ定義(#defineで定義)し、プログラムコードではそのマクロを書くのが定石です。
例えば、仕様に変更が入り、ある設定値が変更となりました。これがプログラムコード中にベタ打ちされていると、入っている箇所全てを修正しなければなりません。1箇所2箇所くらいはどうってことはありませんが、何箇所とあると大変ですし、修正を間違えればバグの元となります。しかし、マクロで定義しておけば修正箇所は一箇所だけで済むので、修正箇所を局所化できますし、変に修正してバグを作り込む危険性を減らすことにもなります。
そのため、プログラムコード中にそうした定数はベタ打ちとせず、マクロ定義で対応するのがよいとされています。

投稿2016/09/21 11:47

archiver

総合スコア1557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/09/21 11:52

readelf -a hello | head このコマンドで出てくるマジックとはもしかして別物ですかね?
archiver

2016/09/21 11:57

別です。そうなると2つの意味を持つことになりますね。「マジックナンバー=悪」と呼ばれるものが私が回答したものになります。 そして、strike1217さんが知りたい方のマジックナンバーはファイル(主にバイナリ形式の)のタイプを示すものです。ファイルヘッダの所に埋め込まれて、zip形式のファイルであるとか、そういった種別を判別するための値です。
strike1217

2016/09/21 12:06

ホォォォォ・・・ 2種類あるのですね〜 わかりました。ありがとうございます
guest

0

「マジックナンバー = 悪」、「マジックナンバー、やってはいけない」
とかありますが、どういうことでしょう??

price = 100; amount = price * 1.08;
tax_rate = 1.08; price = 100; amount = price * tax_rate;

上のサンプルコードの「1.08」が、
一般的にプログラミングで「マジックナンバー」と呼ばれるものです。

下のように変数や定数に格納する方が良いです。
(このコードでは消費税の意味です)

なぜなら、後で何の数字だったか忘れたり、
変更されるときに探すのが大変になったりして、
書いた時は自明でも、後で保守性が落ちるからです。

投稿2016/09/21 11:45

編集2016/09/21 11:48
LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/09/21 11:50

ああ〜〜〜。 わかりやすいです。 セキュリティ的な意味があるのかと思っていましたが、セキュリティは関係なさそうですね。
k1000

2016/09/23 05:23

消費税に関する部分で「0.05」「1.08」とかならまだわかりやすいと思うのですが、消費税率が5%から8%に上がったときに対応漏れしているプログラムがあってどうして漏れたのかと思ったら「本体価格÷20→消費税額」という計算方法で……さすがに(0.05の逆数の)「20」は想定外でした。当時はマジックナンバーという言葉を知りませんでしたが、まさにあれがそうだったと思った次第です。
LLman

2016/09/23 06:51

>strike1217さん >セキュリティ的な意味 「フォーマット識別子としてのマジックナンバー」の方も、 まず識別するためにあるもので、それが数字なのも、 セキュリティというより容量節約のためと思ってます。
LLman

2016/09/23 07:01

>k1000さん >「本体価格÷20→消費税額」という計算方法 それは大変分かりにくいですね。 典型的なマジックナンバーだと思います。 もしかして、小数を避けた方が分かりやすい、 と記述者は思ったのかもしれません。推測ですけど。
guest

0

マジックナンバーとは何でしょうか?

ググって調べてみましたか? こういうのがでてきますけど・・・

マジックナンバー (プログラム)
https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)

投稿2016/09/21 11:46

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/09/21 11:49

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問