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

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

突然發現自己離了電腦就不知道怎么算,為什么,我在死學嗎?

突然發現自己離了電腦就不知道怎么算,為什么,我在死學嗎?

#include<stdio.h> int main() { int x=3; int sum=0; sum=(++x)+(++x)+(--x); printf("%d\n",sum); } 這個代碼是如何算出14的,求過程。
查看完整描述

3 回答

已采納
?
onemoo

TA貢獻883條經驗 獲得超454個贊

前面一個回答是有問題的,我在后面的留言中指出了錯誤所在。


首先說,像 (++x)+(++x)+(--x) 這樣連續使用自增減運算符的表達式是有問題的,這代碼的行為是未定義的,它得出 10 11 13 ... 什么的都有可能...

具體來說,造成問題的主要原因有兩點:

  1. 運算符的操作數的求值順序是不確定的。

    C標準沒有規定運算符操作數的求值順序,C標準只規定了運算符的運算順序結合性

    比如表達式 a + b + c * d,根據運算符運算順序我們可以確定乘法運算符優先于加法運算符,所以 c * d 先算;而加法運算符的結合性是從左到右,所以再算 a + b,隨后再加上 c * d 的結果。

    a b c d 這些就叫做運算符的操作數,這幾個變量的具體的值是什么時候確定的呢? 這幾個操作數的求值順序是也按照運算順序來嗎?(先確定c和d的值,再確定a和b的值?) 答案是:不確定! 這幾個變量的值在運算前確定就可以了,具體是誰先誰后、在哪個時點都有可能。

    也許你會疑惑,a b c d這幾個變量的值在這個代碼中不是也不會變化嗎? 什么時候確定不都一樣嗎? ?也許是,但是不要忘了很多時候操作數不是簡單的變量,操作數也可能是其他的表達式或函數調用的返回值,這樣操作數求值順序的變化也許會導致操作數的值也不同(比如你題目中的表達式就是此例,詳解見下一條)。

  2. 自增減運算符是有副作用的(自增就是副作用),在你的這個表達式中,這三個副作用的發生時機也不確定!

    這里不明白的話,請看我在老問答區的一個回答?http://www.xianlaiwan.cn/qadetail/64864??

以上兩點結合起來就導致了這個表達是的值也是不確定的!

絕對不要再實踐中寫C標準中未定義行為的代碼!

查看完整回答
1 反對 回復 2017-03-17
  • 3 回答
  • 1 關注
  • 1254 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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