C言語の変数の宣言
知らなかった。いや、確かに言われてみるとそのとおりと思うんだけどね。
ある程度プログラムをかじったことがあれば変数のスコープ(有効範囲)について学んだことがあると思う。
たとえばC++やJAVAなんかはどこでも変数などの宣言ができるのでスコープに注意しよう。みたいな話とかも上記の話といっしょに聞くことがあると思う。
で、この話をC言語に置き換えてみると変な感じ。だってC言語って関数の上の方でしか宣言できないではないか。そうおもってた。
だけどね……。いや、ホントにオレは知らなかった。
C言語でもスコープの先頭なら変数の宣言ができるなんて。
list1 #includeint main(void) { int i; for(i = 0; i < 10; i++) { printf("無駄\n"); } return 0; }
これは普通のC言語。何の変哲もない。
ちなみにC言語でスコープの範囲を表すには"{"と"}"を使う。つまり…。
list2 #includeint main(void) { int i; for(i = 0; i < 10; i++) { int j = i; printf("無駄(%d回目)\n", j); } return 0; }
このようにfor文のスコープ内の先頭ならば変数を宣言できる。まぁ、このプログラムではこう記述するメリットはないだろうけど。
あぁ、ちなみにC言語ではC++やJAVAのように
list3 //list1と同じ結果を期待したのだが…… #includeint main(void) { for(int i = 0; i < 10; i++) { printf("無駄\n"); } return 0; }
このような書き方はできない。あくまでも「スコープの先頭」(for文の"()"はスコープを表すものじゃあない)だけなのだ。
ちなみに、こんなエラーが出る。
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.c:
エラー E2188 test.c 4: 式の構文エラー(関数 main )
エラー E2451 test.c 4: 未定義のシンボル i(関数 main )
エラー E2379 test.c 4: ステートメントにセミコロン(;)がない(関数 main
警告 W8070 test.c 8: 関数は値を返すべき(関数 main )
3 errors in Compile
作者注:上記の環境はWin98上のBorlandのC/C++コンパイラ5.5.1で検証した結果です。
当然、以下のようにも書けない。
list4 //list2と同じ結果を期待したもの #includeint main(void) { int i; for(i = 0; i < 10; i++) { printf("無駄\n"); int j = i; printf("(%d回目)\n", j); } return 0;
さっきも書いたけど、やっぱり「スコープの先頭」じゃないとダメなのだ。
ちなみにこの場合のエラーは以下の通り
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.c:
エラー E2140 test.c 9: ここでは宣言はできない(関数 main )
1 errors in Compile
という訳で、まあ知っておくと結構便利かもしれないようなマイナーな事だから余計な混乱を招くような気もしないでもないけど、知っておいて損はないだろう。っていうか、オレは今マイナーと書いたけど本職の方々にとっては当たり前のこと??
あと、なんかlistなんちゃらとか書くとCマガジンっぽいね。いつか記事にしてくださいご連絡お待ちしています(ぇ