すがブロ

sugamasaoのhatenablogだよ

C言語の変数の宣言

 知らなかった。いや、確かに言われてみるとそのとおりと思うんだけどね。
ある程度プログラムをかじったことがあれば変数のスコープ(有効範囲)について学んだことがあると思う。

 たとえばC++JAVAなんかはどこでも変数などの宣言ができるのでスコープに注意しよう。みたいな話とかも上記の話といっしょに聞くことがあると思う。

 で、この話をC言語に置き換えてみると変な感じ。だってC言語って関数の上の方でしか宣言できないではないか。そうおもってた。
だけどね……。いや、ホントにオレは知らなかった。
C言語でもスコープの先頭なら変数の宣言ができるなんて

list1
#include 

int main(void) {
	int i;
	
	for(i = 0; i < 10; i++) {
		printf("無駄\n");
	}
	return 0;
}

これは普通のC言語。何の変哲もない。
ちなみにC言語でスコープの範囲を表すには"{"と"}"を使う。つまり…。

list2
#include 

int 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と同じ結果を期待したのだが……
#include 

int 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上のBorlandC/C++コンパイラ5.5.1で検証した結果です。
当然、以下のようにも書けない。

list4
//list2と同じ結果を期待したもの
#include 

int 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マガジンっぽいね。いつか記事にしてくださいご連絡お待ちしています(ぇ