前言

大一在學程式語言時,關於 ++ii++

只記得老師有特別說這是先加跟後加的差別

其他一些細節忘了,如今再回頭練習基本的 C/C++

才發現自己很多觀念還需要再重構(就跟以前寫的程式碼一樣…OTZ)

解釋

如果今天是一個簡單的for迴圈,++i跟i++在執行結果上是沒有差別的,可是如果情況是比較單一的,像是以下的例子,就會發現先做跟後做的差別了

1
2
3
4
5
i++
i = 1;
c = i++;
cout << c << "," << i << endl;
// c will be 1, i will be 2
1
2
3
4
5
++i
i = 1;
c = ++i;
cout << c << "," << i << endl;
// c will be 2, i will be 2

上述例子不難理解,但我這裡主要想記錄的是先執行跟後執行在程式背後的差別

在C++物件導向的設計中,在做 i++ 時,是用 operator++() 這個 function,而這個 function 會先複製目前i的值到一個暫存變數中,然後先回傳這個暫存變數,最後才會利用 reference 的方式 increment

但如果是 ++i 則會直接做 increment,然後回傳 *this

i++

  • i → assign → increment

++i

  • i → increment → assign

piece of code from cppreference:

1
2
3
4
5
6
7
8
9
10
11
struct X{
X& operator++(){
// actual increment take place here
return *this;
}
X operator++(int){
X tmp(*this); // copy
operator++(); // pre-increment
return tmp; // return old value
}
};

心得

滿多書本或是網路上的資料都說在寫迴圈時,若無特殊需求,i++++i 並不會影響結果,但是就影響 performance 的潛在機會而言,++i 會是較好的選擇與習慣

不過我覺得除非真的是處理非常大非常大的迴圈(?

不然現今的 Compiler 都優化的滿不錯的,或許差別並沒有想像中的大吧…

但還是稍微學到了一課,原來 i++++i 的細節是這樣的