ここから本文です

C言語についての質問です。 #defineで宣言した変数は、 どのようなデータ型に...

rr_********さん

2013/1/2114:04:43

C言語についての質問です。

#defineで宣言した変数は、
どのようなデータ型になるのでしょう?

思うような値が出ずに、printf文を使って中身を確認したいのですが、
%dなのか%lfなのか、混乱してしまいました。

ご教授いただけるとありがたいです。

閲覧数:
67,109
回答数:
5
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

khu********さん

2013/1/2119:03:34

すでに回答が出ている通り、#define は「Cプリプロセッサ」というプログラムが「ソースコードの置き換え」をするための指示(ディレクティブ)です。

プリプロセッサ pre-processor とは、「前もって処理する者」という意味です。
Cコンパイラは、起動されると、まず「ソースコードを Cプリプロセッサで前処理」して、その結果を Cコンパイラに渡す、という動作をします。

たとえば、
#define A 10
というディレクティブがあって、
printf( "%d", A );
という文があると、

Cプリプロセッサによって
printf( "%d", 10 );
に置き換えられ、これが Cコンパイラに渡されます。

つまり、このディレクティブによって置き換えられる A は、変数ではなく、「単に『ここ』を置き換えなさい」という「目印」に過ぎないのです。
まず、ここを理解してください。



さて、置き換えた後の「もの」の型ですが、これは状況によって変わります。

C では、全ての定数、変数、関数に何らかの型があります。例外はありません。プログラマが明示的に型を指定しない場合でも、コンパイラは「暗黙の型」を与えます。
(型無しなら void という特別な型名が付けられます)

たとえば、
#define B "ABC"
というディレクティブがあるとして、
printf( "%s", B );
という文があるとします。

Cプリプロセッサは、これを
printf( "%s", "ABC" );
としますが、この "ABC" は「型の無い定数」ではありません。全ての定数には何らかの型が「決まる」からです。
(ちなみに、この文字列定数の型は const char[ ] です)

実数の場合、%d なのか %f なのかは、ディレクティブをどう書いたかによって決まります。
たとえば
#define C 5
というディレクティブがあって、
printf( "%d\n", C );
printf( "%f\n", C );
とすれば、%f の方は正しく表示されないでしょう。

このディレクティブを
#define C 5.0
と変更したら、今度は %d の方が正しく表示されないでしょう。

質問した人からのコメント

2013/1/21 20:15:02

成功 defineは置き換えなのですね… 無知をさらしてしまいました。

みなさん、丁寧な解答をありがとうございます!
任意のデータ型にされることがわかりやすかったので
khurataさんの解答をBAにしたいと思います。

皆様、ご回答ありがとうございました!

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

bak********さん

2013/1/2118:57:47

defineは変数じゃありません。単純にソースコードを置き変えるだけです。
例えば

#define HELLO printf("hello");

int main(){
HELLO
return 0;
}

こんなのでもコンパイルが通ります。
データ型は、例えば「1」と書いたらint型に、「1.0」と書いたらdouble型になりますが、
#defineは置き換えるだけなので、そういうコンパイラの自動的な判断で決まります。

というわけでデータ型とかを厳密なものにしたければ、constでも使いましょう。

kuo********さん

2013/1/2116:27:49

#include <stdio.h>
#define C 'A'
#define S "string"
#define I 123
#define F 12.3
main()
{
printf("C = %c or %d or %p or %x\nS = %d or %s or %p or %x\nI = %d\nF = %e or %f or %g\n",C,C,C,C,S,S,S,S,I,F,F,F);
}

プロフィール画像

カテゴリマスター

hid********さん

編集あり2013/1/2114:52:23

#define は、変数ではないので、printf の対象には、成り得ません。

#define print display という定義ならば、
print と書けば、display と見なして展開され、
文字列が、置き換えられてから、コンパイルされます。

コンパイルに入る前の、前処理、
プリプロセッサ―が、この文字列の置き換えを行うもので、
この作業を完了してから、コンパイラーが、実行されます。


つまり、

#define value n

と書いて、

int n ;

printf ( "%d", value ) ;

と書けば、

printf ( "%d", n ) ;

ということです。

※ 無機的に、文字列が、置き換えられるだけのことです。

w_f********さん

2013/1/2114:22:27

defineはコンパイル前に文字が置き換わるだけの機能です。
#define VAL = 1 << 8;

のように計算式を書くことができます。
if( data < VAL)

if( data < 1 << 8)
のように展開出来ます。
ですので1とやればintですし、2.2はfloat、 1+1 は 1+1になります。

注意として
#define ADD 1+1
val = ADD * 2:
は4ではなく
3になります。 これはコンパイルする前(計算する前)に展開しているからです。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる