GCC は8 進数である必要があるint i=048;
ためエラーとして扱いますが、8 進数で表示することはできません。048
8
しかし、なぜ GCC はよりインテリジェントになり、10 進数として扱うことができなかったのでしょうか?
048 を 10 進数として解釈すると、言語「C」の構文規則に反するためです。0 で始まる数値はすべて「8 進数」として解釈する必要があります。
コンパイラは標準に準拠するよう懸命に努力しているため、これは良いことです。
また、自分の C コンパイラ用の C パーサーを作成しているとします。このパーサーは、048, 049..
すべて 10 進数であることを実際に「理解」できます。では、そのパーサーをどのように作成しますか? その可能性はありますが、信じられないほど複雑です。そして、大量のバグの発生源。
GCC は標準に準拠するよう努めているため、実際には GCC のせいではありません。
しかし、「数値トークンが 0 で始まるが 8 進数でない場合は、10 進数として扱う」という形式の例外を作成した場合を想像してみてください。この比較的複雑なルール (「コードが通常の方法で意味をなさない場合、別の解釈にフォールバックし、その方法で意味があるかどうかを確認する」) であるだけでなく、他のあらゆる種類の予期しない動作を示します。
/* My bearings */
int east = 000; // 0 in Octal = 0
int northeast = 045; // 45 in Octal = 37
int north = 090; // Starts with 0 but contains 9, must be decimal = 90
int northwset = 135; // Starts with 1, is decimal = 135
...
確かに、既存の動作を持つ同様のコードが、変数の意図しない値でコンパイラを通過する可能性があります。重要なのは、ケースを支援する特別なルールを追加すると、他のケースが残るということです。エラーのいくつかは異なる解釈ができることを理解するよりも、エラーを見つけてそのように扱うほうがよいでしょう。
(FWIW、私は 8 進数表記を使用したことがなく、その存在が怖いと感じました。他の多くの状況では、プレゼンテーションのために 10 進数に 0 を埋め込むからです。C でそれを決して行わないことを覚えておくには、少し余分な頭脳の力が必要です。)
C 言語では、この場合に診断 (エラー) を発行する必要があります。GCC は準拠する必要があります。
それとは別に、あなたが提唱しているタイプの行動は非常に有害です。さまざまなバグ/タイプミスを覆い隠し、非常に紛らわしい矛盾をもたらします。たとえば、コードに次のものが含まれているとします。
int x = 01800;
を に変更する18
と20
、 の値x
が実際に減少します。
gcc
あなたが入力した場合、より優れた知性を持つ人は何をすることを期待しますか
int i=047;
...そして、その後、同僚の 1 人がプログラムを読み取りに変更した場合、どうなるでしょうか。
int i=049;
.. 「2」を追加するだけで値が から39
に変わったことを知って、あなたと彼または彼女はびっくりするでしょう!49
最小驚きの原則は、あらゆる種類の設計者を導くのに役立ちます。これが C 言語の設計の要因であったことは間違いありません。
とは言うものの、8 進リテラルは単に先頭の 0 が離れているわけではありません。そのために、python やrust などの言語は 8 進数を " 0o47
" としてエンコードします (C などの 16 進数リテラルに似ています)。