四則計算と算術演算子
四則計算
四則計算とは、足し算、引き算、掛け算、割り算のことです。
(加算、減算、乗算、除算)
もちろんプログラミングでもこれらの計算ができます。
以下のコードは加算、減算、乗算、除算を順に行い結果を表示します。
static void Main(string[] args)
{
int add = 6 + 2;
int sub = 6 - 2;
int mul = 6 * 2;
int div = 6 / 2;
Console.WriteLine(add);
Console.WriteLine(sub);
Console.WriteLine(mul);
Console.WriteLine(div);
Console.ReadLine();
}
8 4 12 3
足し算と引き算は問題ないと思いますが、掛け算と割り算の記号は日本の算数で目にする記号とは異なるので注意してください。
演算子(オペレーター)
+記号や-記号などの、何らかの演算を行う記号をプログラミングでは演算子(オペレーター)といいます。
特に数学的な計算を行う演算子を算術演算子といいます。
代入に使用する「=」記号は代入演算子といいます。
算術演算子や代入演算子などは演算子の左右にある値を使用して処理を行います。
このような演算子を二項演算子といいます。
演算子の左側を「左辺」「左辺値」「左オペランド」といい、右側を「右辺」「右辺値」「右オペランド」といいます。
マイナス記号は減算に使用しますが、単独でも使用することができます。
int num = -5;
このようにすると変数numには「-5」が代入されます。
処理に必要な値がひとつだけの演算子を単項演算子といいます。
つまりマイナス記号は単項演算子と二項演算子の二つの働きがあります。
なお、プラス記号も単項演算子として使用できますが、符号(プラスorマイナス)を書かなければ正の数になるので記述する必要はありません。
処理に値を三つ必要とする三項演算子というものもあります。
(これは改めて説明します)
演算子の優先順位
改めて足し算を行う一行に注目してみます。
int add = 6 + 2;
このコードは変数addに「8」を代入します。
この時のプログラムの処理の順序は「6 + 2」を先に計算し、その結果を変数addに代入しています。
変数addに6を代入してから2を加算しているのではありません。
つまり、代入記号と計算記号とが一行で同時に登場した場合、まずは計算記号のほうから先に処理が行われます。
これは算数での「掛け算と割り算は、足し算と引き算よりも先に行う」というルールと同じで、プログラミングにも処理順序のルール、優先順位があるのです。
演算の優先順位を変更する方法は後述します。
評価
数学的な計算や関数の実行など、何らかの処理を行うとその処理の結果が返ってきます。
例えば
int number = 1 + 2;
この式の場合「1 + 2」という処理の結果を変数numberに代入しています。
この時、「1 + 2 」の処理を行うことを、式を評価するといいます。
「1 + 2」を評価し、その結果が代入演算子により変数numberに代入されます。
「何らかの式を実行し、その結果を得ること」が評価です。
変数同士の演算
変数は自由に値を取り出すことができますから、変数同士をそのまま計算することができます。
int num1 = 6;
int num2 = 3;
num1 = num1 + num2 - 5;
Console.WriteLine(num1);
4
割り算の注意点
ゼロ除算
数学では「値をゼロで割る」ことは禁止されていて、C#を初めとする多くのプログラミング言語ではエラーとなります。
double real = 10 / 0;
上記のような単純な式では間違うことはありませんが、変数を使用して計算を行うと気付かないうちにゼロ除算をしてしまうことがあります。
整数値同士の除算
int型(整数型)同士で割り算を行うと、計算結果は小数点以下切り捨てとなってしまいます。
int num1 = 5;
int num2 = 2;
double real = num1 / num2;
Console.WriteLine(real);
2
小数点以下の値を得るにはdouble型同士の計算をするか、一時的に実数型(小数型)に変換する必要があります。
データの変換については組み込み型の型変換で改めて説明します。
特殊な算術演算子
計算のための記号にはほかにも以下のようなものがあります。
- %
- 剰余(あまり)を求める。
- ()
- 計算順序を変える。
int rem = 7 % 2;
int num = 7 * (6 - 2);
Console.WriteLine(rem);
Console.WriteLine(num);
1 28
%演算子は除算のあまりを求めます。
(7 ÷ 2 = 3 あまり1)
丸括弧は算数でも使用する記号で、計算の順序を変更します。
通常の算数では波括弧{}、角括弧[]も使用されますが、C#ではこれらは計算順序の変更には使用できません。
丸括弧は入れ子にできるので、以下のように重ねて使用します。
int num = 6 / ((5 - 4) * 3);
Console.WriteLine(num);
2
複合代入演算子
変数の計算結果を同じ変数に代入を行う場合は複合代入演算子を利用するとより簡潔に記述することができます。
- x += y
- x = x + yと同じ
- x -= y
- x = x - yと同じ
- x *= y
- x = x * yと同じ
- x /= y
- x = x / yと同じ
- x %= y
- x = x % yと同じ
これは以下のように使用します。
int num1 = 6;
int num2 = 3;
num1 += num2 - 5;
Console.WriteLine(num1);
4
これは以下と同じ意味となります。
int num1 = 6;
int num2 = 3;
num1 = num1 + (num2 - 5);
演算の順序に注意してください。
通常の代入演算子と同じく、複合代入演算子による演算はその右辺をすべて演算した後に行われます。
足し算、引き算だけならば気にする必要はありませんが、掛け算や割り算を含む式の場合は計算結果が異なる場合があります。
int num1 = 6;
int num2 = 3;
num1 = num1 * num2 - 5;
Console.WriteLine(num1);
num1 = 6;
num1 *= num2 - 5;
Console.WriteLine(num1);
13 -12
インクリメント、デクリメント演算子
変数に保存した数値はインクリメント演算子、デクリメント演算子を使用して値を増減することができます。
- ++x
- xの値を1増やす(前置増分)
- x++
- xの値を1増やす(後置増分)
- --x
- xの値を1減らす(前置減分)
- x--
- xの値を1減らす(後置減分)
int inc = 10;
int dec = 10;
inc++;
dec--;
Console.WriteLine(inc);
Console.WriteLine(dec);
11 9
代入記号がないのに変数自体の値が変化していることに注目してください。
「++」で値を1増やすことをインクリメント、「--」で値を1減らすことをデクリメントといいます。
「++x」と「x++」はどちらも「xの値を1増やす」という処理ですが、両者には違いがあります。
int inc1 = 10;
int inc2 = 10;
int number1 = ++inc1;
int number2 = inc2++;
Console.WriteLine(inc1);
Console.WriteLine(inc2);
Console.WriteLine("");
Console.WriteLine(number1);
Console.WriteLine(number2);
11 11 11 10
「++inc1」は、「変数inc1の値を1増やし、その値を返す」という処理になります。
「inc2++」は、「変数inc2の値を返し、その後に変数inc2の値を1増やす」という処理になります。
変数inc1もinc2も、インクリメント後の値はどちらも同じですが、値を変化させるタイミングがそれぞれ異なるので、変数number1とnumber2には異なる値が代入されることになります。