
#defineについて質問です。
#defineは、ソースコード内にこの文字を見つけたら、コンパイルする前にこの文字をこの定数に置き換えて、というプリプロセッサですよね?だから、printfで#defineで定義した定数を出力する場合で、変換指定が必要ない場合は
#include <stdio.h>
#define DEF 100
void main(){
printf("#defineで定義された定数はDEFです");
}
でもいいと思うんです。ですがこのソースコードは間違いで、実行結果は
#defineで定義された定数はDEFです(←置き換えられてない)
となってしまします。プリプロセッサだけ実行しても、DEFは100に置き換えられずそのままです。printfで#defineで定義した定数を出力させたい場合は書式指定をしなければなりません。なぜ、このような場合は#defineで定義した定数は置き換えられないのでしょうか?回答よろしくお願いします。
No.5ベストアンサー
- 回答日時:
「なぜ置き換えられないのか」について説明しましょう。
マクロが置き換えるのは、文字の並びではなく、トークンになります。
どういうことかというと、
#define DEF 100
とした場合、
DEFINE
は「DEFINE」のままで「100INE」にはなりません。
置き換えできるのは「DEF」という文字の並びが前後と区切られているときだけです。
ここでトークンについて説明しましょう。一言で言うなら、記号や識別子などのプログラムの最小構成要素です。自然言語で言うなら、単語や句読点です。
sum=a+b;
という一行のソースコードはトークンに分解すると、以下のようになります。
sum
=
a
+
b
;
この段階ではそれが変数なのか、関数なのか、演算子なのかは考慮されていません。全部「トークン」です。
printf("#defineで定義された定数はDEFです");
この部分は以下のようなトークンに分解されるでしょう。
printf
(
"#defineで定義された定数はDEFです"
)
;
文字列リテラルはそのままトークンになります。DEFというトークンが存在しないことがわかります。これでは置換できないのも当然です。
この辺の挙動は参考URLのWikipedia -コンパイラの3.1フロントエンドも参考にしてください。
なお、文字の並びを置換しない理由ですが、単純な置換よりもトークン単位の方が役に立つからです。冒頭のように「DEF」というマクロで「DEFINE」の一部が置換されるといやですよね。
参考URL:http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3% …
詳しい・・・!
確かにトークンにしないと不便ですね。
トークンがないとソースももっと正確に書かないといけなくなりますし、便利ですねトークン。
No.3
- 回答日時:
引用府内は置換されないので
引用符の外に出せば出来ます
#include <stdio.h>
#define DEF "100"
void main(){
printf("#defineで定義された定数は" DEF "です");
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- その他(プログラミング・Web制作) Arduino UNO のC言語 2 2023/04/18 19:42
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
(C言語)めちゃくちゃな値にな...
-
C言語 関数
-
C言語 九九表
-
文字コードについて
-
勝率をプログラムに
-
ダブルポインタで2次元配列を作成
-
コマンドラインに出力した文字...
-
テキストカーソル位置の取得
-
c言語でAからZまでを表示する...
-
LU分解法のピボット選択機能実...
-
\\x1bを使ったswitch文が反応し...
-
長方形、円、三角形の計算する...
-
C言語の勉強しています。すみま...
-
一番大きい奇数を表示する
-
8人分のテストの点数を入力し、...
-
九九を表示させるプログラム
-
scanfに文字が入力されたときに...
-
printf( " %2d", p * q );
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語で2000年以降カレンダーを...
-
c言語でAからZまでを表示する...
-
【C】fizzbuzzのトリッキーなコ...
-
strcmp
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
コマンドラインに出力した文字...
-
8人分のテストの点数を入力し、...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
(C言語)めちゃくちゃな値にな...
-
cshの文字列操作(0埋め)
-
テキストカーソル位置の取得
-
コマンドプロンプトがすぐ消える
-
printfの出力内の文字をdefine...
-
scanfに文字が入力されたときに...
-
台形の面積を求めるプログラム
-
改行について 1行に何個かづ...
-
WM_CLOSEで閉じれないウィンド...
おすすめ情報