四則計算と算術演算子
四則計算
四則計算とは、足し算、引き算、掛け算、割り算のことです。
(加算、減算、乗算、除算)
もちろんプログラミングでもこれらの計算ができます。
以下のコードは加算、減算、乗算、除算を順に行い結果を表示します。
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
には異なる値が代入されることになります。
より正確に言えば、++inc1
を評価すると、変数inc1
の値がひとつ増え、評価値として増えた後の値が得られます。
inc2++
を評価すると、変数inc2
の値がひとつ増えますが、評価値は増える前の値となります。