int main ()
{
int a = 5,b = 2;
printf("%d",a+++++b);
return 0;
}
このコードでは次のエラーが発生します。
エラー: 増分オペランドとして左辺値が必要です
a++ +
しかし、との間にスペースを入れると++b
、正常に動作します。
int main ()
{
int a = 5,b = 2;
printf("%d",a++ + ++b);
return 0;
}
最初の例のエラーはどういう意味ですか?
ベストアンサー1
コンパイラは段階的に記述されます。最初の段階はレクサーと呼ばれ、文字を記号構造に変換します。したがって、「++」は のようなものになりますenum SYMBOL_PLUSPLUS
。その後、パーサー段階でこれを抽象構文木に変換しますが、記号を変更することはできません。スペースを挿入することでレクサーに影響を与えることができます (スペースは、引用符で囲まれていない限り、記号を終了します)。
通常の字句解析器は貪欲です(例外もありますが)。そのため、コードは次のように解釈されます。
a++ ++ +b
パーサーへの入力はシンボルのストリームなので、コードは次のようになります。
[ SYMBOL_NAME(name = "a"),
SYMBOL_PLUS_PLUS,
SYMBOL_PLUS_PLUS,
SYMBOL_PLUS,
SYMBOL_NAME(name = "b")
]
パーサーはこれを文法的に間違っていると判断します。(コメントに基づいて編集: ++ を r 値に適用できないため、a++ の結果となり、意味的に間違っています)
a+++b
は
a++ +b
それは問題ありません。他の例も同様です。