C言語でのインクリメントとデクリメント。変数初期化のカンマ演算子を少し。
インクリメントとデクリメント
整数型の変数の値を1増やしたり、1減らしたりする演算子があり、カウントアップやカウントダウンに使われる。
変数の値を1増やす演算子をインクリメントといい、変数の値を1減らす演算子をデクリメントという。
インクリメントは「++(プラス2個)」で表し、デクリメントは「--(マイナス2個)」で表す。
それぞれに、変数名の前後に付けて、下記のように使用する
名称 | 使用方法 |
後置インクリメント | a++ |
前置インクリメント | ++a |
後置デクリメント | a-- |
前置デクリメント | --a |
インクリメント・デクリメントが使用できない言語もある
Java、Perl、PHP、C系言語などはインクリメント・デクリメント演算子を実装しているが。
例えばRubyなんかが、インクリメント・デクリメントができない。Pythonも使えないらしい。
その理由について、Rubyに関しては。
++の動作が本質的に「変数を操作する」ものであるため,変数がオブジェクトでないRubyでは導入できない
Rubyではその他の多くのプログラミング言語と違い、「変数」を「オブジェクト」として扱っていないようです。そのためRubyにおいての変数は、数そのものへのポインタということになり、ここに破壊的動作である++演算子を使用してしまうと、「ポインタの位置がインクリメントされる」という正しく破壊的な結果がもたらされてしまうようです。
n++ はオブジェクト n に対するメソッドのように見えます。 しかし、メソッドは変数 n ではなく、n が参照しているオブジェクトに対する操作です。 それに従った、数値(例: 2)オブジェクトの意味を変える(例: 2 オブジェクトを 3 の意味にする)という処理をするわけではありません。 インクリメントは、変数が参照する数値オブジェクトを、別の数値オブジェクトに切り替える処理になります。
要するに、CやC++、C#は変数の中身を1増減できる(値が入っているだけだから)。
しかし、Rubyに関しては、変数はオブジェクトのアドレスを指すものだから、それをインクリメント・デクリメントしてしまうと、まったく別のオブジェクトのアドレスを参照してしまうから、そんな演算子は実装できない。
らしいです。
ソースコード
a=10、b=0の変数の値で、それぞれ処理を行ってみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include<stdio.h> #include <stdlib.h> // system("pause")を使用するため int main(void) { // 変数の初期化 int a = 10,b = 0; printf("\n 初期値\n a = %d : b = %d\n\n", a, b); // インクリメント----------------- // 後置インクリメント printf(" 後置インクリメント\n"); b = a++; // bにaを代入してから、aに1を足す printf(" b = a++\n"); printf(" a = %d : b = %d\n\n", a, b); // 前置インクリメント printf(" 前置インクリメント\n"); a = 10, b = 0; b = ++a; // aに1を足してから、bにaを代入する printf(" b = ++a\n"); printf(" a = %d : b = %d\n\n\n", a, b); // デクリメント------------------- a = 10, b = 0; printf("\n 初期値\n a = %d : b = %d\n\n", a, b); // 後置デクリメント printf(" 後置デクリメント\n"); b = a--; // bにaを代入してから、aから1を引く printf(" b = a--\n"); printf(" a = %d : b = %d\n\n", a, b); // 前置デクリメント printf(" 前置デクリメント\n"); a = 10, b = 0; b = --a; // aから1を引いてからbにaを代入する printf(" b = --a\n"); printf(" a = %d : b = %d\n\n", a, b); system("pause"); // これが一時停止の命令 return 0; } |
実行結果
カンマ演算子
ソースの、7,20,26,36行目がおかしいと思っただろうか?
1 |
a = 10, b = 0; |
通常なら
1 2 3 4 5 6 |
a = 10; b = 10; // または a = 10; b = 10; |
こう書くべきであるが、これはカンマ演算子といって、調べたらどうもセミコロン(;)の代わりもやってしまうらしいのだが、構文や文法のルールが壊れるので、使用しない方がいいという意見が多いので、使わないようにしよう。
ただし、変数宣言のこれは除く。
1 |
int a = 0, b = 0; |
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。