討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
for迴圈控制運算式i++與++i的不同
更改我的閱讀文章字型大小
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/20 下午 03:49:48

int i;
  
  for(i=0;i<=2;i++)
  printf("%d\n",i);



int i;
  
  for(i=0;i<=2;++i)
  printf("%d\n",i);

執行結果都一樣
唯一的不同是每次執行控制運算式時的動作不同
例如
第一個範例跑完第一圈後執行i++ 就等於 先i=i,然後再i=i+1

也就是i會先指派給(覆蓋)i值, 然後i才加1



而第二個範例是跑完第一圈執行++i 就等於 i=i+1這樣
沒有覆蓋動作



這樣見解對嗎?


作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/20 下午 06:17:34
code 1 :
++i;

code 2 :
i++;

and compile them and watch their assembly codes to find differences between them.
:) have fun
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/20 下午 06:49:36

>code 1 :
>++i;
>
>code 2 :
>i++;
>
>and compile them and watch their assembly codes to find differences between them.
>:) have fun



so am i right ?????
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/20 下午 07:26:44
http://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i-in-c
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/20 下午 09:27:06

>http://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i-in-c

of course i know the difference between i++ and ++i
you dont know my question
i am asking that my view is right or not right.
and stop typing english, i feel so tired talking with you.
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/20 下午 09:37:47
okay. you are so funny. :)
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/20 下午 10:02:26

>okay. you are so funny. :)

thanks for telling me that
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/20 下午 11:36:58
>第一個範例跑完第一圈後執行i++ 就等於 先i=i,然後再i=i+1
>也就是i會先指派給(覆蓋)i值, 然後i才加1

不對. 'i++' 本身沒有什麼「指派」(i=i) 的動作.


>而第二個範例是跑完第一圈執行++i 就等於 i=i+1這樣
>沒有覆蓋動作
>這樣見解對嗎?

也不對. i=i+1 這個動作就沒有「覆蓋」或「指派」的意義嗎?

你對「覆蓋」這個見解本身就有矛盾, 上面的說法就不精確.


在內建類型並單獨使用的情況下, ++i 跟 i++ 沒有什麼分別. 'i' 的內容都「增一」. 而這個「增一」在 C 語言裡是個副作用 (side-effect).

前置跟後置的分別在於副作用所發生的時機. 而這個只有在把 ++i 或 i++ 放在其它式子裡才看得出來, 比方說:
  int i = 0;
  int x = i++;
  i = 0;
  int y = ++i;

'x' 會得到副作用發生前的值, 'y' 會得到副作用發生後的值.

但在 C++ 裡, ++ 運算子是可以用在使用者自訂的架構 (struct 或 class) 上的. 這時程式員必須自己寫出前置跟後置的超載函式. 雖然程式員可以自行決定它們的行為, 但一般還是比照 ++ 運算子對 int 類型的行為來處理. 一般來說, 後置運算子的超載會比較複雜. 所以如果程式只要「增一」的副作用, 用前置的運算子會比較有效率.


作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 上午 12:35:43
http://stackoverflow.com/questions/4261708/i-or-i-in-for-loops
maybe above discussions is a good reference :)
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 上午 08:26:18
http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm
作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 上午 10:06:16
〉so am i right ?????

看來是連試都沒試.....
作者 : ivan_4(Ivan)
[ 貼文 6 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 上午 10:37:09
各位先進 以後會常常在各處回覆以下的話

請用單步執行確定程式執行順序
及配合watch查看變數結果

如果仍然不清楚
請開啟disassemble視窗
觀看組語到底是如何動作的
自然就一目了然了

何必在那裡憑空想像 猜測
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 下午 03:19:33
>請用單步執行確定程式執行順序
>及配合watch查看變數結果
>如果仍然不清楚
>請開啟disassemble視窗
>觀看組語到底是如何動作的
>自然就一目了然了
>何必在那裡憑空想像 猜測
這觀念不太正確喔!
用這方式,只能確認所用編譯器當下的做法,不能當C/C++語義的解釋。
i++和++i的區別,就是該表示式反迴的是i更新前的或更新後的值之不同而已。
其它行為都是憶測或所用編譯器當下的做法而已。
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 下午 03:51:23

>不對. 'i++' 本身沒有什麼「指派」(i=i) 的動作.
>

>也不對. i=i+1 這個動作就沒有「覆蓋」或「指派」的意義嗎?
>
>你對「覆蓋」這個見解本身就有矛盾, 上面的說法就不精確.
>
>
>在內建類型並單獨使用的情況下, ++i 跟 i++ 沒有什麼分別. 'i' 的內容都「增一」. 而這個「增一」在 C 語言裡是個副作用 (side-effect).
>
>前置跟後置的分別在於副作用所發生的時機. 而這個只有在把 ++i 或 i++ 放在其它式子裡才看得出來, 比方說:
>  int i = 0;
>  int x = i++;
>  i = 0;
>  int y = ++i;
>
>'x' 會得到副作用發生前的值, 'y' 會得到副作用發生後的值.
>
>但在 C++ 裡, ++ 運算子是可以用在使用者自訂的架構 (struct 或 class) 上的. 這時程式員必須自己寫出前置跟後置的超載函式. 雖然程式員可以自行決定它們的行為, 但一般還是比照 ++ 運算子對 int 類型的行為來處理. 一般來說, 後置運算子的超載會比較複雜. 所以如果程式只要「增一」的副作用, 用前置的運算子會比較有效率.
>



對...

但我現在是想問這兩個迴圈在執行 i++ 和 ++i 時的動作或+值的順序有沒有不同,
我就是想 焦點 在 這兩個範例. 因為我目前還是無法想出怎麼判斷它們哪裡不同
其他例子的i++與++i的差別基本上我都懂....








作者 : ivan_4(Ivan)
[ 貼文 6 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 下午 04:17:15
>這觀念不太正確喔!
>用這方式,只能確認所用編譯器當下的做法,不能當C/C++語義的解釋。
>i++和++i的區別,就是該表示式反迴的是i更新前的或更新後的值之不同而已。
>其它行為都是憶測或所用編譯器當下的做法而已。

每個人的學習經驗不同 沒有對錯可言
我是先會用 再回頭看理論

一學期->4個月->16周->3學分->48小時

要一個學生上48小時的課
先把C/C++語義的解釋看完,再開始coding?

金門大學 陳鍾誠老師 的文章正好是我的想法
大學武林 --「氣宗」與「劍宗」之爭
http://ccckmit.wikidot.com/po:linbaili3
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 409 | 人氣 0 | 評價 1890 | 評價/貼文 4.62 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 下午 04:52:50
總規而論,++i 和 i++ 在取用其返回值時,其效果不同。
++i 返回加一之後的 i 值;而 i++ 返回加一之前的 i 值。
這個效果會在程式中取用其返回值做利用時產生不同的影響,我想這個樓主已經知道了,就像是:

a = ++i;
b = i++;

回到樓主的例子上,由於你沒有對其計算之返回值進行利用的行為,因此兩種不同的寫法都會將 i 加一,其結果完全相同。
在這樣的使用下,他們所呈獻的結果是一樣的,這也是由 C 標準所保證的;
若真要說有不同,那就是在效能上可能產生的影響。

如同前輩所說,i++ 的處理比較複雜,因此一般來說會花上比較多的計算資源。
但對於基本型態變數而言,現今許多的 CPU 有提供相關的指令,或者編譯器最佳化效果的緣故,
這兩種寫法對於基本型態變數實則沒有任何效率上的差別。

但必須強調一下,C 標準只定義了某種寫法所應該得到的結果,對於實做層面如何做到這些效果的事情是不太管的。
也就是說,在樓主發問的例子上,兩種寫法所計算的結果完全沒有差異,但效能上可能有所不同。
至於效能上是否不同的議題,具體就要看你所使用的開發工具和執行環境了,以語言標準來看是沒有辦法解答你的問題的,
其效能可能不同,也可能無異。

以上說的是基本型態變數,但如果是自訂類別的自訂運算子,通常後加的寫法是真的效率會比較差。
也因此才會流傳說儘量養成寫為前加的形式這樣的說法。
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 下午 06:08:23
http://www.embedded.com/design/programming-languages-and-tools/4410601/Pre-increment-or-post-increment-in-C-C-
embedded.com 's column
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 下午 06:13:06
>總規而論,++i 和 i++ 在取用其返回值時,其效果不同。
>++i 返回加一之後的 i 值;而 i++ 返回加一之前的 i 值。









這個需要你多說明
我知道結果一樣, 且都是+1
但執行i++ 與++i 的動作也一樣嗎?

這我不理解
我只理解++i 是直接i=i+1
但i++ 呢?


在這裡,
你有聽到我的問題所在
所以你才說到 "++i 返回加一之後的 i 值;而 i++ 返回加一之前的 i 值"
這就是我要的答案
我就是要知道執行i++ 或 ++i時, 它們加1的動作的差別
但你可說得更仔細點嗎?

像是 ++i就是把i直接先加1,
而i++ 我就需要你的說明了, 謝謝














>這個效果會在程式中取用其返回值做利用時產生不同的影響,我想這個樓主已經知道了,就像是:
>a = ++i;
>b = i++;
>回到樓主的例子上,由於你沒有對其計算之返回值進行利用的行為,因此兩種不同的寫法都會將 i 加一,其結果完全相同。
>在這樣的使用下,他們所呈獻的結果是一樣的,這也是由 C 標準所保證的;
>若真要說有不同,那就是在效能上可能產生的影響。
>如同前輩所說,i++ 的處理比較複雜,因此一般來說會花上比較多的計算資源。
>但對於基本型態變數而言,現今許多的 CPU 有提供相關的指令,或者編譯器最佳化效果的緣故,
>這兩種寫法對於基本型態變數實則沒有任何效率上的差別。
>但必須強調一下,C 標準只定義了某種寫法所應該得到的結果,對於實做層面如何做到這些效果的事情是不太管的。
>也就是說,在樓主發問的例子上,兩種寫法所計算的結果完全沒有差異,但效能上可能有所不同。
>至於效能上是否不同的議題,具體就要看你所使用的開發工具和執行環境了,以語言標準來看是沒有辦法解答你的問題的,
>其效能可能不同,也可能無異。
>以上說的是基本型態變數,但如果是自訂類別的自訂運算子,通常後加的寫法是真的效率會比較差。
>也因此才會流傳說儘量養成寫為前加的形式這樣的說法。
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 下午 08:49:22
>其他例子的i++與++i的差別基本上我都懂....

請你說明一下你所知道的差別, 這樣我們才知道你到底懂多少, 以及懂的是否正確.


++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 不是可以從編譯器的編譯組語結果看得出來的. 有多少人會自認已從編譯組語理解了語言行為後再回頭看理論的?

作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/21 下午 09:31:14
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1188.pdf
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/22 上午 09:56:05
http://c-faq.com/expr/seqpoints.html
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/22 下午 05:10:33
昨天我問了我的程式老師

他說在這兩個迴圈例子
i++ 跟 ++i 的加1動作是相同的
兩個都是i=i+1 而已 ,
且兩個迴圈的執行效能都一樣


作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 409 | 人氣 0 | 評價 1890 | 評價/貼文 4.62 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/22 下午 05:27:46
>昨天我問了我的程式老師
>
>他說在這兩個迴圈例子
>i++ 跟 ++i 的加1動作是相同的
>兩個都是i=i+1 而已 ,

那是因為你沒有對其返回值進行更多的利用,因此才會有作用都一樣的結果,我前面已經說明過。

>且兩個迴圈的執行效能都一樣

關於效能的問題,前面已經解釋過了,哪裡看不懂可以提問。
基本上:

兩種寫法的效能「一定」都一樣 --> 不正確的說法。
兩種寫法的效能「通常、許多時候」都一樣 --> 正確的說法。

如同我前面說的,C語言並沒有對效能部份(或者說底層的實做方式)進行明確的定義。



怎麼感覺每次回答你的問題都像在講廢話浪費時間!
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/22 下午 06:58:24
>那是因為你沒有對其返回值進行更多的利用,因此才會有作用都一樣的結果,我前面已經說明過。



一開始我就是強調"加值"的動作有啥不同,
 你一直強調"結果"是怎樣 ??




>關於效能的問題,前面已經解釋過了,哪裡看不懂可以提問。
>基本上:
>兩種寫法的效能「一定」都一樣 --> 不正確的說法。
>兩種寫法的效能「通常、許多時候」都一樣 --> 正確的說法。
>如同我前面說的,C語言並沒有對效能部份(或者說底層的實做方式)進行明確的定義。









>怎麼感覺每次回答你的問題都像在講廢話浪費時間!


你可以選擇別回答
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/23 下午 12:21:42
>每個人的學習經驗不同 沒有對錯可言
>我是先會用 再回頭看理論
我沒說,使用debuger對學習是錯的。
但語義的學習,若不從語義的定義了解,而以Debugger去看程式的行為會有W差。
例如用debuger試圖了解i=i++;的語義是會導致錯誤觀念的。
使用debug追蹤的結果,總會顯示某種"固定"的結果(編譯器的當下行為的結果)。
這個結果會誤導人以為了解了該式子的語義。
但實際上這個式子的C/C++語義,結果是未定義的。

>一學期->4個月->16周->3學分->48小時
>要一個學生上48小時的課
>先把C/C++語義的解釋看完,再開始coding?
不必全盤看完了解再codding,但碰到問題還是回頭看語說明會比較好。
先用debugger看看程式的行為,也不是不可以。但最後還是以C/C++的定義準。
其實C/C++也沒那麼多古怪難理解的東西,學習到某一階段,幾乎可以判斷那些東西需要回頭去定義的。
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1270 | 評價/貼文 1.22 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/29 上午 09:53:07
#include <iostream>

using namespace std;

// 用這 class 來描述 ++int/int++ 的處理細節
class MyInt
{
 int Value;
public:
 // Constructor
 MyInt(){}
 // Constructor
 MyInt(int i) { Value = i; }
 // Constructor
 MyInt(const Myint &Src) { Value = Src.Value; }
 // Destructor
 ~MyInt() {}

 // 拷貝
 Myint &operator=(const Myint &Src)
 {
  Value = Src.Value;
  return *this;
 }

 // 設定
 Myint &operator=(int i)
 {
  Value = i;
  return *this;
 }

 // ++int
 Myint &operator++()
 {
  ++Value;
  return *this;
 }
 // int++
 Myint &operator++(int)
 {
  int R = Value; // 先保留原值
  ++Value;
  return MyInt(R); // 以右值引用(Rvalue)傳回原值
          // 接收端若不保存,原值會消失
 }

 operator int() const
 {
  return Value;
 }
};

ostream &operator <<(ostream &out, const Myint &v)
{
 return (out << (int)v);
}

int main()
{
 Myint v1 = 5;
 Myint v2 = v1++;

 cout << "v1 = " << v1 << endl
  << "v2 = " << v2 << endl;

 return 0;
}

作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/29 上午 10:43:47
> // int++
> Myint &operator++(int)

postfix-operator 不能傳回 reference, 必須傳回 value.

> {
>  int R = Value; // 先保留原值
>  ++Value;
>  return MyInt(R); // 以右值引用(Rvalue)傳回原值
>          // 接收端若不保存,原值會消失

一般習慣是這麼做:
  Myint old = *this;
  ++(*this); // 或 operator++();
  return old;

> }

這是為了方便程式維修. 因為如果 Myint 的複雜度增加, 你也只需維修 operator++() 的部份.

作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1270 | 評價/貼文 1.22 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/29 下午 12:50:38

>> // int++
>> Myint &operator++(int)
>
>postfix-operator 不能傳回 reference, 必須傳回 value.
對 這很重要 這裡的回傳不能加那個 &

>
>> {
>>  int R = Value; // 先保留原值
>>  ++Value;
>>  return MyInt(R); // 以右值引用(Rvalue)傳回原值
>>          // 接收端若不保存,原值會消失
>
>一般習慣是這麼做:
>  Myint old = *this;
>  ++(*this); // 或 operator++();
>  return old;
>
>> }
>
>這是為了方便程式維修. 因為如果 Myint 的複雜度增加, 你也只需維修 operator++() 的部份.
>
 嗯 R大說的話要聽 ^^
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/10/30 下午 12:42:02
>請你說明一下你所知道的差別, 這樣我們才知道你到底懂多少, 以及懂的是否正確.
>++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 不是可以從編譯器的編譯組語結果看得出來的. 有多少人會自認已從編譯組語理解了語言行為後再回頭看理論的?
>






所以假如是只有下面這行
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++ 來的高




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


 板主 : 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.234375