猿问

为什么a+b不能工作?

为什么a+b不能工作?

int main (){
   int a = 5,b = 2;
   printf("%d",a+++++b);
   return 0;}

此代码提供以下错误:

错误:作为增量操作数所需的lvalue

但如果我把空间a++ +++b然后它就可以正常工作了。

int main (){
   int a = 5,b = 2;
   printf("%d",a++ + ++b);
   return 0;}

第一个例子中的错误意味着什么?


一只名叫tom的猫
浏览 407回答 3
3回答

幕布斯6054654

printf("%d",a+++++b);被解释为(a++)++ + b根据最大Munch规则!.++(后缀)不计算为lvalue但它需要它的操作数是lvalue.6.4/4表示下一个预处理令牌是构成预处理令牌的最长字符序列“

德玛西亚99

Lexer使用通常被称为“最大咀嚼”的算法来创建令牌。这意味着在读取字符时,它会一直读取字符,直到遇到与它已经拥有的字符不同的标记(例如,如果它一直在读取数字,那么它拥有的是一个数字,如果它遇到了一个A它知道这不可能是数字的一部分。所以它停下来离开了A在输入缓冲区中用作下一个令牌的开头)。然后,它将该令牌返回给解析器。在这种情况下,这意味着+++++获取如a ++ ++ + b..因为第一个后增量产生一个rvalue,第二个不能应用于它,编译器会给出一个错误。只是FWIW,在C+中你可以过载operator++若要生成一个lvalue,则允许此操作。例如:struct bad_code {      bad_code &operator++(int) {          return *this;     }     int operator+(bad_code const &other) {          return 1;     }};int main() {      bad_code a, b;     int c = a+++++b;     return 0;}C+编译器(VC+,g+,Comeau)可以编译和运行(尽管它什么也不做)。
随时随地看视频慕课网APP
我要回答