【C言語】
自動変数を宣言する場所は
~関数先頭か参照直前か~

■この記事の概要

この記事では、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());
}

変数を参照する直前で
有効値を設定しているので
変数スコープも狭く読みやすくなっています。

宣言と同時に値設定するので
未初期化リスクも極めて低いスタイルです。