「K&R C」は、1978 年の Kernighan & Ritchie の著書「The C Programming Language」の初版で定義された言語を指します。
K&R (つまり、ANSI 以前) の C では、エンティティは通常、明示的な型なしで宣言でき、デフォルトで type になりますint
。これは、C の祖先言語である B と BCPL にまでさかのぼります。
main(a,b,c,d){
printf("%d", d);
}
これは、次とほぼ同等です。
int main(int a, int b, int c, int d) {
printf("%d", d);
}
ANSI C (1989) および ISO C (1990) では、古い構文は有効でしたが廃止されましたが、1999 年の ISO C 標準では、"implicit int" ルールが廃止されました (古いスタイルの宣言と定義の構文は維持されています)。
ほぼ同等であると言ったことに注意してください。定義として見ると本質的に同じですが、宣言としてはパラメーターの型情報を提供しません。古いスタイルの定義では、引数の数または型が間違っている呼び出しを診断する必要はありません。それは未定義の動作です。プロトタイプが表示されている場合、引数の不一致はコンパイル時の診断をトリガーし、可能であれば、引数は暗黙的にパラメーターの型に変換されます。
これは の定義なので、main
別の問題があります。標準では、 の 2 つの形式のみが指定されmain
ています (1 つは引数なし、もう 1 つは 2 つの引数、argc
およびargv
)。実装は他の形式をサポートするかもしれませんが、4 つのint
引数を持つものはそれらの 1 つではない可能性があります。したがって、プログラムの動作は未定義です。実際にd
は、最初の呼び出しでガベージ値が含まれる可能性があります。(もちろん、C では の再帰呼び出しmain
が許可されていますが、良い考えはほとんどありません。)
foo(a,b){
a = 2;
b = 'z';
}
これは、次とほぼ同等です。
int foo(int a, int b) {
a = 2;
b = 'z';
}
'z'
(そして、は typeint
ではなく、 type であることに注意してくださいchar
。)
繰り返しますが、古い形式ではパラメーターの型チェックが行われないため、次のような呼び出しを行います。
foo("wrong type and number of arguments", 1.5, &foo);
診断する必要はありません。
結論: K&R スタイルの関数宣言と定義がどのように機能するかを知っておくとよいでしょう。それらを使用する古いコードがまだあり、C2011 でもまだ有効です (ただし廃止されています) (ただし、「暗黙的な int」ルールはありません)。しかし、それらを使用するコードを作成する正当な理由はほとんどありません (非常に古いコンパイラを使用している場合を除きますが、それはまれであり、ますますまれになっています)。
しかし、C プログラミングでそのような構文を使用することはないと断言できます。
優秀な!