【C言語】
わかりやすい変数名の付け方
~局所変数の場合と外部変数の場合~

■この記事の概要

この記事では、C言語でループカウンタの変数名に長い名前を使うべきでない理由を解説しています。

特にloop_counterのような冗長な名前は避け、ijのような短い名前が推奨されています。

さらに、混乱を招くl(エル)の使用や、タイポによるroopといった不適切な名前の例も挙げています。

■長い名前は本当に分かりやすいですか?

#include <stdio.h>
int main(void){
    char    buffer[27]={0} ;
    /* 自動変数宣言 */
    int loop_counter;
    /* 自動変数初期化 */
    loop_counter = 0 ; 

    for(loop_counter = 0 ; 
            loop_counter < 26 ;
                loop_counter = loop_counter + 1){
        buffer[loop_counter] = 'A' + loop_counter ; 
    }
    
    puts(buffer);
}

↑↓これは間違いだ!


保守の事を考えると”変数名”に意味のない名前を与えると後でわからなくなる。
多少面倒でも後で見て何を意味している変数なのかわかるようにする。
エディタの補完機能を使って、すべての変数に長い名前を付ける事。
ループカウンタであろうと i や jやk を使用することを禁止する。


●文脈にかかわらず 局所変数にloop_counter のような長い変数名を付けるのは間違いです。
●ループカウンタのような局所変数の名前は i,j,kで十分です。
●なんでもかんでも長い名前を強制する上司や先輩は
リーダブルコードもプログラミング作法も読んでいません。


■局所変数は有効範囲に応じて短くてもOK

#include <stdio.h>
int main(void){
    char    buf[27]={0} ;
    for(int i = 'A'; i <= 'Z' ;i++){
        buf[i - 'A'] = i ; 
    }
    puts(buf);
}

「明解さは簡潔さによってもたらされる」プログラミング作法より


■ループカウンタに l (エル)は止めよう

●1 l(エル)は1(壱)と紛らわしいです for(int l = 1;l<10;l=l+1)
●2 l(エル)はi,j,kの次の4重ループを示唆しているので構造が複雑になっていませんか?


■外部変数でi,j,k等を宣言してはいけない

warning: declaration shadows a variable in the global scope

警告:宣言が外部変数を隠す
[-Wshadow]

int i = 5678;//★ダメ
#include    <stdio.h>
int main(void)
{
    for(int i = 0 ;i < 1234;i++){
        ;
    }
    printf("%d\n",i);//予期しない i を参照する
}

グローバル変数(global変数)/外部変数/広域変数
これらの変数は使わないに越したことはありませんが
どうしても使う場合は充分に「わかりやすい名前」を付けましょう。

これらの外部変数に汎用的な短い名前i,j,kは
みんなに見られて恥ずかしいので付けてはいけません。
局所変数が適切な物を外部変数で宣言するのは止めましょう。

上記の例では8行目で i を参照した際、1234が表示される事を期待して、1行目の 5678 を表示してしまいます。


参考:

DCL01-C. サブスコープで変数名を再利用しない

https://www.jpcert.or.jp/sc-rules/c-dcl01-c.html

Linux カーネル コーディング規約
(中略)
グローバル変数には意味がよく分かる名前を付けてください。
(中略)
ローカル変数の名前は短くて、変数の特徴を表したものにします。

https://linuxjf.osdn.jp/JFdocs/kernel-docs-2.6/CodingStyle.html