■この記事の概要
この記事では、C言語での自動変数の宣言位置について、「関数の先頭で宣言」する古いスタイルと、「参照直前に宣言と初期化」を行う現代的なスタイルを比較しています。後者はスコープを狭めてコードを読みやすくし、未初期化リスクを低減します。具体例を交えてベストプラクティスを提案しています。
■古い教科書で勉強してはいけない
今時こんな事書いてる教科書は捨てましょう。
「C言語では
自動変数の宣言位置は
{ }で囲まれたブロック先頭に
制限されてる」
➡20年以上前の昔のC言語仕様です。
参考今時の仕様:
変数宣言と実行コードの位置関係
■時代遅れの変数宣言と初期化(非推奨)
#include <stdio.h>
//スタブ関数
int get_x(void){return 2;}
int get_y(void){return 3;}
int get_z(void){return 4;}
//体積積を求める
int get_volume(void){
//1.関数の先頭で変数宣言
int x;
int y;
int z;
int volume;
//2.とりあえず0で初期化
x = 0 ;
y = 0 ;
z = 0 ;
volume = 0;
//3.本処理で値設定
x = get_x();
if(x < 0)
return -1;
y = get_y();
if(y < 0)
return -1;
z = get_z();
if(z < 0)
return -1;
volume = x * y * z;
return volume;
}
int main(void){
printf("体積 = %d\n",get_volume());
}
(1)関数の先頭で変数宣言
(2)未初期化防止のためとりあえず0で初期化
(3)本処理で値設定
の3部構成からなる
K&RとかC89とかいう
古い時代のよくあるスタイルです。
■参照直前で変数宣言と初期化(推奨)
#include <stdio.h>
//スタブ関数
int get_x(void){return 2;}
int get_y(void){return 3;}
int get_z(void){return 4;}
//体積積を求める
int get_volume(void){
//変数参照直前で変数宣言と同時に値設定
int x = get_x();
if(x < 0)
return -1;
int y = get_y();
if(y < 0)
return -1;
int z = get_z();
if(z < 0)
return -1;
return x * y * z;
}
int main(void){
printf("体積 = %d\n",get_volume());
}
変数を参照する直前で
有効値を設定しているので
変数スコープも狭く読みやすくなっています。
宣言と同時に値設定するので
未初期化リスクも極めて低いスタイルです。