int i 1 i i 0 i i 為什麼i等於2而不是3?

時間 2021-05-31 04:42:18

1樓:水劍承王

永遠不要在乙個表示式裡同時既訪問乙個變數的值,又更改它的值。

如果你無意中寫了這樣的表示式,那程式的行為是未定義的。

未定義的行為是最危險的,應該像避瘟疫一樣避開它。

所謂未定義的行為就是:任何事情都有可能發生。

程式可能無法通過編譯,即便通過了也可能無法執行,即便執行了,它也可能崩潰、執行混亂、或者產生毫無意義的結果。

所以你又何必糾結它算出的值?

補充一點,題主的第一句話其實就有問題:」 首先 i 先做判斷 1 > 0 「

除了包含邏輯and,邏輯or,條件運算子 ? : ,或者逗號運算子 , 的子表示式以外,C語言並沒有定義子表示式的運算順序。

也就是說,對於這個表示式語句: i = i ++ > 0 ? i++ : i;

= 號左邊的子表示式 i 和 = 號右邊的子表示式 i ++ > 0 ? i++ : i ,cpu先算誰是未定義的。

大多數時候,子表示式的計算順序對整個表示式的值沒有影響,但是當子表示式中出現這幾個有side effect的運算子時,就要特別小心了。

2樓:

路要一步一步好好走,不要學爬樹。

不要在乙個語句裡對乙個變數賦值、自增超過一次。

這是未定義行為,通俗來說是一句歧義語句,不同編譯器有不同結果。

寫出這樣的語句不僅不方便閱讀,甚至可以認為是「錯誤」的。

3樓:

本來以為又碰到了日經問題,結果發現題主對序列點的描述是正確的,但問題並不出現在序列點上:

首先這是乙個序列點:

int i = 1;

然後,條件運算子的第乙個運算元是另乙個序列點,也就是i++>0.....這是乙個序列點.至此一切都符合題主預期,同時沒有任何UB,可是

最後:i = iUB了....

總的來說就是,題主從i++的坑里爬出來,起身形優雅地跳過了序列點的坑,向前走了幾部,再次掉進了i++的坑.....

轉世多少次才夠學明白C++啊......

4樓:

stackoverflow.com/questions/16511489/yet-an-other-i-i我在這裡找到了。

i=i++ 中賦值和遞增操作的順序是未定義的。

5樓:

為什麼我不覺得又什麼 undefined 的行為,一切都很正常呀。

i = 1

現在 i 是 1

i =i++> 0 ? i++ : i;

表示式返回 1; i 變成 2

i = i++> 0 ?i++:i;

1 > 0,所以執行後乙個 i++ 作為三元操作符的返回值i = i++ > 0 ?i++: i;

表示式返回 2;i 變成 3

i =i++ > 0 ? i++: i;

把上一句返回的 2 賦值到 i 裡面

索尼(SONY)Xperia1 II 為什麼比Xperia5貴?

一下跨四代?那 1和 6600豈不是差了六千多代?Xperia中高階的命名機制和 各個品牌的 高階相機相同,用阿拉伯數字區分檔次,用後面的小號羅馬數字表示迭代,比如EOS 1DX Mark III,7sIII等。Xperia 1II是除Xperia Pro外最強的Xperia,2020當家旗艦。一般...

賓得K1ii用什麼掛機頭?

Skywalker001 其實我也就是說說而已,以我的技術遠遠沒有到挑器材的水平,能把現有的東西用好就不錯了。K1ii一年了,再來聊聊這個話題。這一年來就是靠大公主和2470f2.8過來的。大公主銳度色彩都非常滿意,除了不防水別的都是優點 2470在70這個焦段還是有點肉,沒有50之前銳利,感覺稍微...

馬榮成為什麼在《風雲II》中,花大幅篇筆墨刻畫了懷空這個人物

個人不同意原打算第二部打算換主角為懷空的相關說法。原打算換主角的是第三部,換成下一代風雲 易風 步天 無奈最後還是把爹從冰窟窿里拉出來了。第二部個人認為主角從一開始還是明確聶風和步驚雲的。但是第二部剛開始時,江湖上還沒有形成類似之前天下會 無神絕宮那樣龐大勢力,天門雖高深莫測但尚在暗處行事只有些卒子...