看板 C_and_CPP 關於我們 聯絡資訊
底下轉至新手十誡 ------------ 你也不可以在一個運算式(expression)中,對一個基本型態的變數修改其值, 而且還在同一個式子的其他地方為了其他目的而存取該變數的值。(其他目的, 是指不是為了計算這個變數的新值的目的)。否則,將導致未定義的行為。 錯誤例子: int arr[5]; int i = 0; arr[i] = i++; 正確例子: int arr[5]; int i = 0; arr[i] = i; i++; [C++程式] 錯誤例子: int i = 10; cout << i << "==" << i++; 正確例子: int i = 10; cout << i << "=="; cout << i++; ------------ 我不懂那兩個錯誤例子錯在哪裡,我的例子: int i=10; std::cout<<i<<' '<<i++<<' '<<i<<' '<<++i<<' '<<i; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.224.150.217
james732:應該就是不要在同一行裡面對一個變數又改又讀的意思...? 02/04 18:10
cfbbq:我知道,但是我覺得沒錯阿,只要不要<<i++ + i;這種就好吧? 02/04 18:13
cfbbq:<<i++<<i;這不是一個運算是阿! 02/04 18:14
ledia:<< 也是運算子呀 02/04 18:27
LPH66:問題如同前幾篇 i++結算的時間不確定 02/04 18:33
LPH66:雖然順序是由左到右 (<<是左結合) 但i++卻不確定會何時結算 02/04 18:33
StubbornLin:http://0rz.tw/d74Qx 02/04 19:17
cfbbq:我的疑問是:cout<<i++<<i;跟cout<<i++;cout<<i;似乎等於? 02/04 19:45
akasan:表面上一樣而已cout<<i++;cout<<i;會保證其求值順序 02/04 20:14
akasan:cout<<i++<<i;則是無法確定到底是i先求值還是i++先求值 02/04 20:15
cfbbq:<<是左結合,可以保証上面的樓上的i++先求值? 02/04 20:22
LPH66:求值歸求值 問題在於i什麼時候+1 02/04 21:24
LPH66:後面的寫法在第一個;時確定i已經加1了 02/04 21:24
LPH66:前面的寫法則要到那條的;才會確定i已經加1 02/04 21:25
LPH66:但這卻是在前式後面的 i 求值之後 02/04 21:25
LPH66:至於此時的 i加1 和 後面的i求值 這兩件事是不確定先後的 02/04 21:26
LPH66:(順帶一提, 某些compiler因為方便實作的關係 02/04 21:26
LPH66: 左結合的東西會實作成每個operand是反過來求值 02/04 21:27
LPH66: 至於是不是一定反過來求則一樣是未規定) 02/04 21:27
LPH66:噢我忘了 overloaded operator 等於 function call...@_@ 02/04 21:37
LPH66:所以下下篇是對的 這裡剛好是特例 前面的i++會在後面i前結算 02/04 21:38
StubbornLin:結合的順序不代表賦值(evaluate)的順序 02/04 21:49
akasan:無聊去測一下...cout << i++ << i; GCC跟VC一樣是12 02/05 14:56
akasan:cout << i << i++;則VC是21 GCC是11 02/05 14:57
akasan:實測或許只代表有compiler沒照標準走但寫CODE還是盡量繞過 02/05 14:59
akasan:這種模糊地帶 免得哪天有BUG了還不知道怎麼一回事:D 02/05 15:00