討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 軟體開發過程中有哪些資安漏洞?
[ 回上頁 ] [ 討論區發言規則 ]
for迴圈控制運算式i++與++i的不同 (新開)
更改我的閱讀文章字型大小
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/31 下午 05:28:22
>請你說明一下你所知道的差別, 這樣我們才知道你到底懂多少, 以及懂的是否正確.
>++i 可以視為以下動作:
>  [i = i + 1]
>  (i)
>
>i++ 可以視為以下動作:
>  tmp = i
>  [i = i + 1]
>  (tmp)
>方括號 [...] 表示它裡面的動作是副作用.
>圓括號 (...) 表示如果 i++ 或 ++i 是在一個式子裡, 這個式子裡會用到的內容. 比方說:
>  x = ++i;
>==> [i = i + 1]
>  x = (i);
>
>  ary[i++] = 0;
>==> tmp = i
>  [i = i + 1]
>  ary[(tmp)] = 0
>如果式子本身只有 i++ 或 ++i, 那 (i) 或 (tmp) 可以被編譯器省略掉, 你看得到的只有 [] 裡的副作用.
>這裡牽涉到一個很重要的概念, 叫 sequence point.
>  http://c-faq.com/expr/seqpoints.html
>副作用 [...] 的動作可以發生在 sequence point 之前的任何時機. 語言標準保證只有在到達sequence point 時, 所有的副作用動作才保證完成.
>C 及 C++ 語言的很多概念, 包括 sequence point 不是可以從編譯器的編譯組語結果看得出來的. 有多少人會自認已從編譯組語理解了語言行為後再回頭看理論的?
>





原問題網址http://www.programmer-club.com.tw/ShowSameTitleN/c/46557.html
新開一個會比較好回覆, 你也比較好看見


所以假如是只有下面這行
i++;

那編譯器會先空出一個記憶體空間給tmp佔存, 而tmp存 i=i+1 之前的值,
再運行i = i + 1
  

而假如只有下面這行
++i;
就是直接i = i + 1

也就是++i 比 i++ 少一個佔存程序

但是有些編譯器有優化
效能上可能 ++i跟 i++ " 大部分時候 " 沒什麼差別

但是如果是用自訂的架構, i++ "大部分" 的時候效能會比 ++i來的差,
除非自己有寫一個超載函式, 如果自己有寫超載函式, 就能讓i++ "大部分時候保持" 與 ++i效能一樣
但是就算自己寫的超載函式,也不一定能讓 i++的效能一直保持與++i效能一致

所以總體上, ++i效能還是比i++ 來的高




請問上述我的見解, 哪個部分有錯 ??
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1046 | 人氣 3227 | 評價 1270 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/2 上午 12:23:04
你都已經了解技術的細節了,要如何去使用的判斷力,也是程式設計師修行的一部份,這一部份常沒有標準答案,不過互相交流學習倒是可以省一些時間在錯誤中學習。
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/2 上午 09:03:30
http://yun.baidu.com/pcloud/album/file?album_id=8883975374523704909&uk=1745354485&fsid=600790662162520

maybe you can find a suggestion from above book . have fun :-)
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/2 上午 09:17:28
>所以假如是只有下面這行
>i++;
>
>那編譯器會先空出一個記憶體空間給tmp佔存, 而tmp存 i=i+1 之前的值,
>再運行i = i + 1

這是可能性之一. 編譯器可以這麼做, 但這不是唯一的做法. 只要結果符合語言標準裡 postfix ++ operator 的定義:
C11 標準草稿, 6.5.2.4 Postfix increment and decrement operators, 第2段:

2. The result of the postfix ++ operator is the value of the operand. as a side effect, the value of the operand object is incremented (that is, the value 1 of the appropriate type is added to it). ...

>而假如只有下面這行
>++i;
>就是直接i = i + 1

C11 標準草稿, 6.5.3.1 Prefix increment and decrement operators, 第2段:

2. The value of the operand of the prefix ++ operator is incremented. The result is the new value of the operand after incrementation. The expression ++E is equivalent to (E+=1).



>也就是++i 比 i++ 少一個佔存程序

一般來說, postfix 比 prefix 稍複雜些, 但編譯器可以根據目標系統的特性來處理. 上面所顯示的是 post-increment 的概念, 不是編譯器的實質做法.

重要的是正確的概念, 不要把時間浪費在編譯器會怎麼做.


>但是有些編譯器有優化
>效能上可能 ++i跟 i++ ' 大部分時候 ' 沒什麼差別

如果你只要副作用, 不要取 'i' 的值, 你幾乎不會看到任何分別, 即使有也可以忽略不計.


>但是如果是用自訂的架構, i++ '大部分' 的時候效能會比 ++i來的差,
>除非自己有寫一個超載函式, 如果自己有寫超載函式, 就能讓i++ '大部分時候保持' 與 ++i效能一樣
>但是就算自己寫的超載函式,也不一定能讓 i++的效能一直保持與++i效能一致
>所以總體上, ++i效能還是比i++ 來的高

如果 'i' 是自訂架構的物件, 要做 ++i 或 i++ 『一定』要自己寫超載函式, 沒有『如果』. 在這前提下, 你上面所講的完全沒有意義.


>請問上述我的見解, 哪個部分有錯 ??

你把概念跟實作混在一起了.

作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/11/4 上午 12:16:22
ㄏㄏ
物件那邊我是還沒摸到啦
所以只能用 如果來說..
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.140625