■時代遅れの変数宣言と初期化(非推奨)
//C89仕様の時代遅れの変数宣言と初期化
//スタブ関数
int get_x(void){return -1; }
int get_y(void){return 0; }
int get_z(void){return 1; }
//体積を求める
int get_volume(void){
//(1)変数数宣言
int x;
int y;
int z;
int volume;//体積
//(2)とりあえず 0 で変数初期化
//変数の量が多いと初期化漏れたりする
x = 0;
z = 0;
//(3)変数設定
x = get_x();
if(x >= 0){
x = get_y();//xとyを間違えている
if(y >= 0){
z = get_z();
if(z >= 0){
volume = x * y * z;//やりたい事が最右端に来る
} else{
volume = -1;
}
}else{
volume = -1;
}
}else{
volume = -1;
}
return volume ;//この変数がどこで設定されたかよくわからない
}
int main(void){
return get_volume();
}
(1)変数宣言
(2)とりあえず0で初期化
(3)本当の値設定
の3部構成からなる
C89仕様時代のよくあるスタイルです。
14行目でyの初期化が漏れているので未初期化の警告が出ます。
20行目でxとyを間違えています。
■変数宣言と同時にとりあえず0で初期化
//C89仕様の時代遅れの変数宣言と同時にとりあえず0で初期化
//スタブ関数
int get_x(void){return -1;}
int get_y(void){return 0;}
int get_z(void){return 1;}
//体積を求める
int get_volume(void){
//変数数宣言と同時にとりあえず 0 で初期化
int x=0;
int y=0;
int z=0;
int volume=0;//体積
//変数設定
x = get_x();
if(x >= 0){
x = get_y();//xとyを間違えている
if(y >= 0){
z = get_z();
if(z >= 0){
volume = x * y * z;
} else{
volume = -1;
}
}else{
volume = -1;
}
}else{
volume = -1;
}
return volume ;
}
int main(void){
return get_volume();
}
int x=0;のように
変数宣言と同時に
とりあえず0で初期化する
スタイルです。
16行目でxとyを間違えていますが
とりあえず0で初期化してしまったので
未初期化の警告は出ません。

■C99仕様の変数参照直前で変数宣言と有効値の設定
//C99仕様の変数宣言と関数出口一つスタイル
//スタブ関数
int get_x(void){return -1;}
int get_y(void){return 0;}
int get_z(void){return 1;}
//体積を求める
int get_volume(void){
//変数数宣言と同時に初期化する
int volume=0; //体積
//変数参照直前で変数宣言と同時に有効値を設定をする
int x = get_x();
if(x >= 0){
int x = get_y();
if(y >= 0){//コンパイルエラーなるので間違えに気が付く
int z = get_z();
if(z >= 0){
volume = x * y * z;
} else{
volume = -1;
}
}else{
volume = -1;
}
}else{
volume = -1;
}
return volume ;
}
int main(void){
return get_volume();
}
14行目で
yが未定義だとコンパイルエラーになるので
間違いに気が付きます。
でも関数出口一つに固執しているので
処理が分かりにくいです。
■早期リターンで不要変数を宣言しない(推奨)
//C99仕様の/変数参照直前で変数宣言と有効値の設定
//スタブ関数
int get_x(void){return -1;}
int get_y(void){return 0;}
int get_z(void){return 1;}
//体積積を求める
//エラーが起きたら早期リターン
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){
return get_volume();
}
関数出口一つに固執せず、
早期リターンすると
int volumeの変数が不要になりました。
変数を使用する直前で有効値を設定しているので未初期化リスクも極めて低いスタイルです。