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

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

請教各位一個問題,求解答: C語言運算符優先級問題

請教各位一個問題,求解答: C語言運算符優先級問題

慕的地6264312 2019-10-19 09:26:38
大佬,求助..碰到個C語言優先級問題題目:請問X的值是多少?#includeintmain(){intx=6;x+=x-=x*x;printf("%d\n",x);}答案是"-60",請問為什么是-60?不是+=比-=優先級高嗎?
查看完整描述

2 回答

?
catspeake

TA貢獻1111條經驗 獲得超0個贊

在C里,這是一個未定義行為。
x+=x-=x*x;
^^
12
1處對x值的讀取與2處對x值的寫入無關,而兩者之間沒有序列點(sequencepoint)分隔。因而這是一個未定義行為。
在C++里,直到C++17明確了賦值與語句之間各個操作數之間的求值順序。在此之前,這也是一個未定義行為。
=====================
未定義行為,什么都可能發生
=====================
+=與-=是同優先級的,右結合,因而i+=j-=k*l;相當于i+=(j-=(k*l))。
=====================
在C++里,自C++17開始,(復合)賦值運算符的右操作數先于(sequencebefore)左操作數。(C++已經不用序列點的概念了)所以,x+=x-=x*x的計算順序為:1先計算:x-=x*x1.1-計算x*x(結果36)1.2-計算2處的x(結果6)1.3-計算x-=x*x(結果-30),并賦值(此后x==-30)2計算1處的x(結果-30)(x值已經修改)3計算x+=x-=x*x(結果-60),并賦值(此后x==-60)
=======================
在C中,與C++17之前,1.3處的賦值與2中的x的值的讀取順序是不確定的。
                            
查看完整回答
反對 回復 2019-10-19
?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

和優先級無關,就是簡單的從右往左執行,拆分一下:
x-=x*x得到-30
x+=x得到-60
最后聲明,常規業務代碼不要這么寫
                            
查看完整回答
反對 回復 2019-10-19
  • 2 回答
  • 0 關注
  • 248 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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