作者查詢 / guesd

總覽項目: 發文 | 留言 | 暱稱
作者 guesd 在 PTT [ C_and_CPP ] 看板的留言(推文), 共24則
限定看板:C_and_CPP
首頁
上一頁
1
下一頁
尾頁
[問題] int x=3,y=1; y+=x-=y; 的問題
[ C_and_CPP ]103 留言, 推噓總分: +4
作者: mo2 - 發表於 2010/08/10 21:28(15年前)
7Fguesd:其實是未定義的 語法上的結合順序只決定了如何運算08/11 00:26
8Fguesd:而運算順序除了有相依時是沒有規定的08/11 00:27
9Fguesd:C裡給變數值是運算副作用 因此取xy的值未必會在+-運算存入後08/11 00:28
27Fguesd:http://c-faq.com/expr/xorswapexpr.html08/11 08:12
28Fguesd:不過我搞錯了,這邊y沒有更動兩次所以沒有這個問題08/11 08:12
29Fguesd:y=y+(x-=y)這部份,固然x-=y的部份會是運算完的結果08/11 08:15
30Fguesd:但是並沒有保證y+(-=)的y取值是在之前或之後08/11 08:16
31Fguesd:不過這邊y並沒有另外更動過所以沒這個問題08/11 08:16
32Fguesd:有問題的是再多串一個如x-=y+=x-=y;這樣 最後的x -= (=+...)08/11 08:17
33Fguesd:這裡的x可以是一開始運算完的x-=y;或是沒運算過的x或是其他08/11 08:17
34Fguesd:即使這符合standard裡assignment的lvalue規範仍會造成未定義08/11 08:20
35Fguesd:不過關鍵也不在取值而在是在同時更動同變數兩次或以上就是了08/11 08:29
36Fguesd:不管是透過=或<op>=或是++ --,取值有問題的是類似a[i]=i++08/11 08:30
37Fguesd:即使=右邊取的值沒問題,不過不能保證左邊的a[i]到底是抓誰08/11 08:31
57Fguesd:呃,assignment並不造成sequence point所以也沒有延後update08/11 15:40
58Fguesd:的問題,除非full expression或一些shortcut op才會產生sp08/11 15:41
82Fguesd:我想你說的是"In all cases, the assignment is sequenced08/12 08:31
83Fguesd:after the value computation of the right and left operan08/12 08:31
84Fguesd:and before the value computation of the assignment expr.08/12 08:31
85Fguesd:吧?這的確限制了你能取得x -= y的值時x已經update過了08/12 08:33
86Fguesd:但是問題是它只規範相依性而不是強制的結算點08/12 08:33
87Fguesd:所以在sp之前有其他平行對x取值或update時仍然無法確定順序08/12 08:34
102Fguesd:嗯 我講的是那個情況沒錯 原本的y-=x+=y;是不會有這個問題08/12 16:40
103Fguesd:所以我以為你在講c++中所有的assignment都不會undefined了:P08/12 16:41
首頁
上一頁
1
下一頁
尾頁