[問題] 新手十誡疑問

看板C_and_CPP (C/C++)作者 (CF)時間16年前 (2009/02/04 18:03), 編輯推噓6(6020)
留言26則, 6人參與, 最新討論串1/2 (看更多)
底下轉至新手十誡 ------------ 你也不可以在一個運算式(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

02/04 18:10, , 1F
應該就是不要在同一行裡面對一個變數又改又讀的意思...?
02/04 18:10, 1F

02/04 18:13, , 2F
我知道,但是我覺得沒錯阿,只要不要<<i++ + i;這種就好吧?
02/04 18:13, 2F

02/04 18:14, , 3F
<<i++<<i;這不是一個運算是阿!
02/04 18:14, 3F

02/04 18:27, , 4F
<< 也是運算子呀
02/04 18:27, 4F

02/04 18:33, , 5F
問題如同前幾篇 i++結算的時間不確定
02/04 18:33, 5F

02/04 18:33, , 6F
雖然順序是由左到右 (<<是左結合) 但i++卻不確定會何時結算
02/04 18:33, 6F

02/04 19:17, , 7F
02/04 19:17, 7F

02/04 19:45, , 8F
我的疑問是:cout<<i++<<i;跟cout<<i++;cout<<i;似乎等於?
02/04 19:45, 8F

02/04 20:14, , 9F
表面上一樣而已cout<<i++;cout<<i;會保證其求值順序
02/04 20:14, 9F

02/04 20:15, , 10F
cout<<i++<<i;則是無法確定到底是i先求值還是i++先求值
02/04 20:15, 10F

02/04 20:22, , 11F
<<是左結合,可以保証上面的樓上的i++先求值?
02/04 20:22, 11F

02/04 21:24, , 12F
求值歸求值 問題在於i什麼時候+1
02/04 21:24, 12F

02/04 21:24, , 13F
後面的寫法在第一個;時確定i已經加1了
02/04 21:24, 13F

02/04 21:25, , 14F
前面的寫法則要到那條的;才會確定i已經加1
02/04 21:25, 14F

02/04 21:25, , 15F
但這卻是在前式後面的 i 求值之後
02/04 21:25, 15F

02/04 21:26, , 16F
至於此時的 i加1 和 後面的i求值 這兩件事是不確定先後的
02/04 21:26, 16F

02/04 21:26, , 17F
(順帶一提, 某些compiler因為方便實作的關係
02/04 21:26, 17F

02/04 21:27, , 18F
左結合的東西會實作成每個operand是反過來求值
02/04 21:27, 18F

02/04 21:27, , 19F
至於是不是一定反過來求則一樣是未規定)
02/04 21:27, 19F

02/04 21:37, , 20F
噢我忘了 overloaded operator 等於 function call...@_@
02/04 21:37, 20F

02/04 21:38, , 21F
所以下下篇是對的 這裡剛好是特例 前面的i++會在後面i前結算
02/04 21:38, 21F

02/04 21:49, , 22F
結合的順序不代表賦值(evaluate)的順序
02/04 21:49, 22F

02/05 14:56, , 23F
無聊去測一下...cout << i++ << i; GCC跟VC一樣是12
02/05 14:56, 23F

02/05 14:57, , 24F
cout << i << i++;則VC是21 GCC是11
02/05 14:57, 24F

02/05 14:59, , 25F
實測或許只代表有compiler沒照標準走但寫CODE還是盡量繞過
02/05 14:59, 25F

02/05 15:00, , 26F
這種模糊地帶 免得哪天有BUG了還不知道怎麼一回事:D
02/05 15:00, 26F
文章代碼(AID): #19YMVwYu (C_and_CPP)
討論串 (同標題文章)
以下文章回應了本文
完整討論串 (本文為第 1 之 2 篇):
文章代碼(AID): #19YMVwYu (C_and_CPP)