なぜa+++++bは機能しないのでしょうか? 質問する

なぜa+++++bは機能しないのでしょうか? 質問する
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

それは問題ありません。他の例も同様です。

おすすめ記事