a+++++b 運算邏輯

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   問題   

int a=1,b=1; int c=a+++++b; printf("c=%d/n",c); 這段代碼是無法通過編譯的。

解釋如下: 

1、首先介紹一些基本的概念 

1)、大嘴法,又稱貪進法: 如果(編譯器的)輸入資料流截止至某個字元之前都已經被分解為一個個符號,那麼下一個符號將包括從該字元起之後可能組成一個 符號的最長字串。也就是說,每一個符號應該包含儘可能多的字元。換句話說,編譯器將程式分解成符號的方法是,從左至右一個字元一個字元地讀入 ,如果該字元可能組成一個符號,那麼再讀入下一個字元,判斷已經讀入的兩個字元組成的字串是否可能是一個符號的組成部分,如果能繼續讀入下一個字元,重複判斷,直到讀入的字元組成的字串已不再可能組成一個有意義的符號。 舉個例子,如a---b 與運算式a-- -b的含義相同,而與a- --b的含義不同。 再比如:b=a/*p /* p指向除數 */; 該語句的本意是用a除以p所指向的值,把所得的商再賦給b。而實際上,/*被編譯器理解為一段注釋的開始,編譯器將不斷地讀入字元, 直到*/出現為止。因此要重寫:b=a / *p /* p指向除數 */; 更清楚點就是b=a/(*p) /* p指向除數 */;此所謂二義性。 

2)、左值和右值:左值就是在賦值中可以放在賦值操作符兩邊的值,比如: int a = 1; double b = 2.0 a = b; b = a; 這裡a和b都是左值,一切變數都是左值,但const量是例外。 右值則是只可以放在賦值操作符右邊的值,比如: int a = 0; char *b = "hello"; 3 = a; // ERROR "howdy" = b // ERROR 這裡3和"howdy"都是右值,所以不能放在賦值操作符左邊,一切常數、字元和字串都是右值。 i 和 -i 都是運算式,但一個是左值(i),一個是右值(-i)。 ++,--這兩種操作符要求作用於左值,所以i++合法,(-i)++不合法。 

結果:a+++++b的含義: 唯一有意義的解析方式是:a ++ + ++ b 可是,根據“大嘴法”規則,應該被分解為:a ++ ++ +b ,這個式子從文法上來講是不正確的,它等價於:((a++)++) +b 但是,a++的結果是不能作為左值的,因此編譯器不會接受a++作為後面的++運算子的運算元。這樣,如果遵循瞭解析詞法二義性問題的規則,上例的解析從文法上來說又沒有意義。因此,在編程實踐中,謹慎的做法就是盡量避免使用類似的結構,除非你非常清楚這些結構的含義。 

參考: 1、《C陷阱和缺陷》 2、http://blog.csdn.net/lovewwy/archive/2009/02/26/3940670.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.