5


0

変数が数字で始まるのはなぜ違法ですか?

変数が数字で始まるのはなぜ違法なのですか?

編集:「3」のような数字だけでなく、「1foo」や「23bar」のような変数を意味します

5 Answer


6


ほとんどの言語のレクサーは、数値リテラルを指定しようとしていると想定するためです。 そして、数値リテラルから「区別できない」変数を宣言して、あいまいさの巨大な爆弾を作成することができます。


3


ポップクイズ:変数が数字で始まることを許可する仮想言語では、これは何ですか?

0xDEADBEEF

C(および関連言語)では、これは16進数のみです。 言語が変数名を数字で始めることを許可している場合、それは変数または16進数である可能性があります。 これは数百万の可能性のある簡単な例です。


1


文字列/文字はほとんど引用符で表されますが、数字は構文なしで「そのまま」解釈されます。

そのため、プログラムは文字を含む変数名と文字列の違いを理解できますが、数字と同じにはなりません。


1


おそらく最も明白な理由の1つは、テーブルに合理的に役立つものをもたらすことなく、あなたの人生をより困難にすることです。 たとえば、Cでは、数字の文字列が識別子であるか、数値リテラルであるかを判別できません。

int 10 = 15;
int 15 = 10 + 5;

2行目の10は、数値リテラル15を保持する変数ですか、それとも数値リテラル10ですか?

別の理由は、変数名が数字で始まることを許可すると、コンパイル中のエラーチェックが、表に合理的に役立つものをもたらすことなく、はるかに複雑になることです。


0


Prolog、Erlang、Fortranの初期バージョンなどの言語では、まったく異なる理由でこれを行う必要がありました。

Prolog / Erlangには変数の割り当てはなく、統一されています。 IIRC、Xが変数の場合、Xの値が2の場合、「2 = X」または「X = 2」に続くコードが処理されます。 したがって、Xがすでに値で統一されている場合、その値は2でなければならず、そうでない場合、Xは2になります。 したがって、 3 = 3`を書くのは問題ありません-それはノーオペレーションになり、 2 = 3`は常に失敗します-Prologでの不一致またはErlangでの実行時エラーのいずれかです。 数値は、数値が表す値ですでに統一されている変数のように動作します。

初期のFortranでは(20年間fortranを使用しなかったことと構文を忘れたことをおologiesびします)、すべての関数引数は参照によって渡されたので、 `void foo(int&x){x = 3; } `と数値で呼び出した場合、コンパイラは数値を静的変数に格納して渡します。 したがって、 `foo(2)`を呼び出すと、静的に保存された値2から3に設定されます。 リテラル `2`で別の関数を呼び出すなど、リテラル2に同じ静的変数を使用した場合、2番目の関数に渡される値は代わりに3になります。

そのため、リテラルの値に自動的に初期化される限り、数値と構文的に同一の変数を持つことができます。 しかし、それらを可変でなく純粋な変数にすることを許可すると、奇妙さがたくさんあります。