記憶域(変数など)を変更することができる演算子は、以下の種類だけです。
メモリの記憶情報を変更する場合の一般的な表現は次のようになります。
記憶域を表現する式 = 情報を表現する式 ;
例えば、変数d を kの情報に3を加えた値に変更する場合は、次のようになります。
d = k + 3;
なお次のように計算式を変更する式は、コンパイルエラーになります。
この場合、'='の左のオペランドが、左辺値になっていません のようなエラーメッセージをだすコンパイラが多いようです。
この左辺値とは、変更できる記憶域の表現という意味の単語です。
d + 1 = 2;
変数を変更する時、変更前の情報を利用して変更する場合がよくあります。 例えば 変数d を2増やした値に変更する処理は、次のように書けました。
d = d + 2; /* 2増やした値に変更 */
これを、複合代入演算子の += を利用すると、次のように簡潔に書けます。
d += 2; /* 2増やした値に変更 */
このように、現在の記憶内容を利用して変更する場合に、 便利な複合代入演算子が使えます。以下にいくつかの例を示します。 (左右は同じ処理になります。)
d = d - 3; /* 3減らす */ |
d -= 3; |
d = d + k * 2; /* (k*2)だけ増やす */ |
d += k * 2; |
d = d * 8; /* 8倍に変更 */ |
d *= 8; |
d = d / 10; /* 10分の1に変更 */ |
d /= 10; |
d = d % 2; /* 2で割った余りに変更 */ |
d %= 2; |
なお、d *= 2 + k; は、 d = d * 2 + k; と同じ処理になりません。
d *= 2 + k; は、d = d * (2 + k); と同じ処理です。
つまり、d = d * 2 + k;のような表現に *= は使えないことに注意ください。同様に
d = 10 - d; や
d = 10 / d;のような表現も複合演算子で表現できません。
なお他に、^ | & << >> をベースにした ^= |= &= <<= >>= などの複合演算子があります。
これらも上記と同じ考え方です。
変数を1増やしたい場合がよくあります。
変数nを1増やす記述に、
n = n + 1; や n += 1; という表現を使いました。
これは、 ++n; と書くことができます。
この+を隙間なく2つ並べた ++ は インクリメント演算子と呼ばれます。
(なお、変数nを1増やすだけなら、n++と書いてもよいことになっています)
同様に、1減らす記述で、
n = n - 1; や n -= 1; という表現を使いました。
これは、 --n; と書くことができます。
この-を隙間なく2つ並べた -- は デクリメント演算子と呼ばれます。
(なお、変数nを1減らすだけなら、n--と書いてもよいことになっています)