为了账号安全,请及时绑定邮箱和手机立即绑定

为什么a+b不能工作?

为什么a+b不能工作?

C
一只名叫tom的猫 2019-06-28 11:08:03
为什么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;}第一个例子中的错误意味着什么?
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

printf("%d",a+++++b);被解释为(a++)++ + b根据最大Munch规则!.

++(后缀)不计算为lvalue但它需要它的操作数是lvalue.

6.4/4表示下一个预处理令牌是构成预处理令牌的最长字符序列“


查看完整回答
反对 回复 2019-06-28
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

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)可以编译和运行(尽管它什么也不做)。


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 406 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信