...コンパイラ (パーサー) は、while の空の条件がエラーであり、 for が Infinite であることをどのように認識しますか?
言語定義は、構文 (文法) とセマンティクスの両方でそれを指定しているためです。
while
ループの構文は次のとおりです。
while ( expression ) statement
for
ループの構文は次のとおりです( C2011の時点):
for ( expressionopt ; expressionopt ; expressionopt ) statement
for ( declaration expressionopt ; expressionopt ) statement
ステートメント内のeachの添字optは、対応する式がオプションであることを示します。これは、テキストによって強化されます。expressionopt
for
6.8.5.3 for ステートメント
...
2文節 1と式 3は省略できます。省略された式-2は、ゼロ以外の定数に置き換えられます。
対照的に、while
ステートメントの制御式はオプションとしてマークされておらず、テキストでも強化されています。
6.8.5.1 while ステートメント
1 制御式の評価は、ループ本体の各実行前に行われます。
制御式が省略される可能性があると解釈する余地はあまりありません。