亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么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 關注
  • 431 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號