void main(void)とmain()ってどう違うんですか???
このHPではvoid main(void)を使ってるんですが、
わたしは学校でmain()と習いました。
どういうときにどっちを使うか教えてください。
まさか…同じものだったりしませんよね?!
単に宣言を省略しているだけです。
>まさか…同じものだったりしませんよね?!
同じになりますよ(^^;
> void main(void)とmain()ってどう違うんですか???
>void main (void)
は,ISO C/C++(ANSI C/C++)に準拠したプログラムを意地でも書きたくない場合に使います。
ISO C(ISO/IEC 9899:1999)とISO C++(ISO/IEC 14882:1998)を読んでみると,
int main (void) { /* ... */ }
と
int main (int argc, char * argv[]) { /* ... */ }
のどちらかの形式のみが準拠であり,他の形式は実装定義となります。
#つまり,コンパイラが異なれば動作が異なる。
ちなみに,同じ意味であれば仮引数の名前が変わったり,char **argvだったりしても問題ないです。
ref) ISO/IEC 9899:1999 5.1.2.2.1 Program startup
ref) ISO/IEC 14882:1998 3.6.1 Main function
で,
>main ()
は,C89(ISO/IEC 9899:1990)では
int main (...)
ですから,厳密には実装定義です。ただし,通常は
int main (void)
の形式として処理されて問題は起きないでしょう。
C99(ISO/IEC 9899:1999)/C++では
>main ()
は,type-specifierが含まれないので構文エラーとなります。
ref) ISO/IEC 9899:1999 6.7.2 Type specifiers
ref) ISO/IEC 14882:1998 7.1.5 Type sepcifiers
結論を言うと,どちらもだめで,
int main (void)
を使う必要があります。
>単に宣言を省略しているだけです。
Cにおいて,仮引数リストが空欄であることと,単一の宣言voidであることは,
意味合いが異なります。
以下,非常に突っ込んだ話になります。
初心者であることを自称する方は飛ばした方がよいでしょう。
まず,「プログラミング言語C 第2版」より関連する構文を列挙します。
declarator:
pointer(opt) direct-declarator
direct-declarator:
identifier
direct-declarator '(' parameter-type-list ')'
direct-declarator '(' identifier-list(opt) ')'
parameter-type-list:
parameter-list
parameter-list ',' '...'
parameter-list:
parameter-declaration
parameter-declaration ',' parameter-list
parameter-declaration:
declaration-specifiers declarator
declaration-specifiers abstract-declarator(opt)
identifer-list:
identifer
identifer-list ',' identifier
#抜粋終わり。
つまり,
func()
は,
declarator: func()
direct-declarator[1]
direct-declarator[1]: func()
direct-declarator[2] '(' identifier-list(opt)[1] ')
direct-declarator[2]: func
identifier[1]
identifer[1]: func
identifier-list[1]: (empty)
として処理されます。それに対して,
func (void)
は,
declarator: func(void)
direct-declarator[3]
direct-declarator[3]: func(void)
direct-declarator[4] '(' parameter-type-list[1] ')'
direct-declarator[4]: func
identifier[2]
identifer[2]: func
parameter-type-list[1]: void
parameter-list[1]
parameter-list[1]: void
parameter-declaration[1]
parameter-declaration[1]: void
declaration-specifiers[1] abstract-declarator(opt)[1]
declaration-specifiers[1]: void
abstract-declarator[1]: (empty)
として処理されます。
ここで,関数呼び出し規則で,identifier-listを持つ関数に関しては,
仮引数と実引数の数が一致しない場合は単に「不定」となっています。
つまり,
void func ();
に対してfunc(10);は,不定ではあるけれど呼び出し自体は有効です。
それに対し,parameter-type-listを持つ関数に関しては,
, ...で終わる関数を除いて仮引数と実引数の数(と型)を一致させなければいけません。
つまり,
void func (void);
に対してfunc(10);は構文エラーとなります。
#単一のparameter-type-list:voidを持つ場合についての特例でvoidのみの場合はひとつも持てない。
このあたりはC99になっても変わっていません。
C++では,identifer-listが許されないので,構文が少し変わっています。
で,parameter-type-listを空にすることが許され,それは単一のvoidと等しいということになっています。
#正確に書くとparameter-type-listではなくparameter-declaration-clauseが空の場合。
わかったようなわからないような…
そもそもint と void の違いはなんなんでしょう???m(_ _)m
先生がvoid は値を返さないとか、int は整数値を返すとか言ってました
でもよくわかりませんでした
解説おねがいしますぅ(^ ^)/
>先生がvoid は値を返さないとか、int は整数値を返すとか言ってました
「返す/返さない」という意味はint,voidなどの型名には含まれないと
おもってください。
Cの基本書に型の説明が必ず書いてあると思うのでまずそれを見てください。
int func(void)
{
int a;
a=5;
return a;
}
このコード例は、返す値はint型、func()を実行するときの引数は無し
関数コール例
int c;
c = func();
void func(int a)
{
int b;
b=a;
return;
}
そしてこのコード例は、返す値は無し、func()を実行するときの引数はint型
関数コール例
func(6);
以上
でわからなければ、基本書で勉強してください。
情報はNET上にも必ずあります。(「C言語」などで検索)
ツイート | ![]() |