-2

GCC は8 進数である必要があるint i=048;ためエラーとして扱いますが、8 進数で表示することはできません。0488

しかし、なぜ GCC はよりインテリジェントになり、10 進数として扱うことができなかったのでしょうか?

4

4 に答える 4

7

048 を 10 進数として解釈すると、言語「C」の構文規則に反するためです。0 で始まる数値はすべて「8 進数」として解釈する必要があります。

コンパイラは標準に準拠するよう懸命に努力しているため、これは良いことです。

また、自分の C コンパイラ用の C パーサーを作成しているとします。このパーサーは、048, 049..すべて 10 進数であることを実際に「理解」できます。では、そのパーサーをどのように作成しますか? その可能性はありますが、信じられないほど複雑です。そして、大量のバグの発生源。

于 2012-11-05T02:05:24.473 に答える
6

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 でそれを決して行わないことを覚えておくには、少し余分な頭脳の力が必要です。)

于 2012-11-05T02:13:18.083 に答える
5

C 言語では、この場合に診断 (エラー) を発行する必要があります。GCC は準拠する必要があります。

それとは別に、あなたが提唱しているタイプの行動は非常に有害です。さまざまなバグ/タイプミスを覆い隠し、非常に紛らわしい矛盾をもたらします。たとえば、コードに次のものが含まれているとします。

int x = 01800;

を に変更する1820、 の値xが実際に減少します。

于 2012-11-05T02:06:49.633 に答える
5

gccあなたが入力した場合、より優れた知性を持つ人は何をすることを期待しますか

int i=047;

...そして、その後、同僚の 1 人がプログラムを読み取りに変更した場合、どうなるでしょうか。

int i=049;

.. 「2」を追加するだけで値が から39に変わったことを知って、あなたと彼または彼女はびっくりするでしょう!49

最小驚きの原則は、あらゆる種類の設計者を導くのに役立ちます。これが C 言語の設計の要因であったことは間違いありません。


とは言うものの、8 進リテラルは単に先頭の 0 が離れているわけではありません。そのために、python やrust などの言語は 8 進数を " 0o47" としてエンコードします (C などの 16 進数リテラルに似ています)。

于 2012-11-05T02:12:45.657 に答える