Skip to main content

4.3 遞增、遞減與複合指定運算子

遞增與遞減運算子

我們很常在迴圈裡用到 i = i+1 這樣的遞增敘述。

int i=1;

while(i<=10)
(
    cout << i << " ";
    i = i+1;  // 遞增 1
}
cout << endl;
1 2 3 4 5 6 7 8 9 10

這種情況可以使用 遞增(increment)運算子 ++ 來處理。

int i=1;

while(i<10)
(
    cout << i << " ";
    i++;  // 遞增 1
}
cout << endl;
1 2 3 4 5 6 7 8 9 10

i++ 就相當於 i=i+1

同樣的 i=i-1; 可以用 遞減(decrement)運算子 -- 來處理。

int i=10;

while(i>0)
(
    cout << i << " ";
    i--;  // 遞減 1
}
cout << endl;
10 9 8 7 6 5 4 3 2 1

複合指定運算子

如果是增減 1 之外的數值,如 i = i+2,則可以用 複合指定(compound assignment)運算子

int i=1;

while(i<10)
(
    cout << i << endl;
    i+=2;  // 遞增 2
}

i+=2 就相當於 i=i+2

常用的複合指定運算子

運算子 範例 相當於
+= i += 2 i = i+2
-= i -= 2 i = i-2
*= i *= 2 i = i*2
/= i /= 2 i = i/2
%= i %= 2 i = i%2

遞增、遞減運算子的評估時機

遞增運算子有兩種使用方式,如果我們要將 變數i 遞增 1。

  • i++
  • ++i

以下兩個程式的執行結果相同。

使用 i++
int i=1;

while(i<10)
(
    cout << i << " ";
    i++;  // 遞增 1
}
cout << endl;
使用 ++i
int i=1;

while(i<10)
(
    cout << i << " ";
    ++i;  // 也是遞增 1
}
cout << endl;

那麼 ++ 放在變數的前面和後面有什麼差別呢?主要在於 先遞增再評估其值 還是 先評估其值再遞增

看了以下這個實例應該就很清楚了。

int i=1;

cout << i++ << endl;  // 1
cout << i << endl;    // 2
cout << ++i << endl;  // 3
cout << i << endl;    // 3

執行到第3行時,cout 要輸出 i++ 的值,到底是 要先輸出i的值,再遞增i 還是要 先遞增i,再輸出i的值

因為我們把 ++ 寫在 i 後面,所以當下是 先評估 i 的值給 cout,之後再遞增 i

而在第5行,因為因為我們把 ++ 寫在 i 前面,所以當下是 先遞增 i,再評估 i 的值給 cout

如果牽涉到指定(assign)運算時也是一樣。

int i=1;
int a;

a = i++;
cout << a << endl;  // 1
cout << i << endl;  // 2
a = ++i;
cout << a << endl;  // 3
cout << i << endl;  // 3

遞減運算子的運作方式相同就不再贅述。

由於遞增遞減運算子使用在複雜的指定敘述中,很容易讓人在閱讀時搞錯評估時機和實際指定過去的值。所以建議只在很單純,絕對不會搞錯的地方使用。否則寧可用 (i+1) 或 (i-1) 這樣明確的寫法。