Programmierkurs
für Naturwissenschaftler/innen

算術演算子

ここでは算術演算子について学ぶ。

基本的な演算

足し算についてはすでに 変数 で見た。

四則演算はそれぞれ

  • +

  • -

  • * (かけ算)

  • / (割り算)

で計算できる。

また剰余は

  • %

で計算できる。 例えば、

console.log(5 % 3)

は 5 を 3 で割ったときの余りである 2 が表示される。

べき乗は

  • **

である (** がない言語や、別の記号を使う言語もある)。 例えば、

console.log(2 ** 3);

は 2 の 3 乗 (つまり $2^3$) である 8 が表示される。 なお、 -2 ** 4 は $-2$ の $4$ 乗であるのか $2$ を $4$ 乗したものに $-1$ を掛けたものなのかがあいまいなので、 このような書きかたはできない。 この場合は (-2) ** 4 ($= 16$) か -(2 ** 4) ($=-16$)のように書く。

*** はプログラム特有の書き方であるから、レポートなどの文書やグラフ等ではこれらの記号を使うべきではない

紹介した 6 つの演算子 +, -, *, /, % 及び ** を使った計算を実際に実行してみよ。

例えば:

console.log(10 + 3);
console.log(10 - 3);
console.log(10 * 3);
console.log(10 / 3);
console.log(10 % 3);
console.log(10 ** 3);

実行結果

優先順位を変更・明示したい場合や、あいまいさを避けるために () を使うことができる。 ただし、このような目的では []{} は使うことができない。

console.log(2 * (3 + 4));
console.log((2 * 3) + 4);
console.log((-2) ** 3);

一つめは $2 \times 3 + 4$ ではなく $2 \times (3 + 4)$ を計算したい場合、つまり加算を優先させたい場合の例である。

二つめは括弧なしで console.log(2 * 3 + 4) と書くのと同等である。 つまり、この場合の括弧は不要であるが、あっても問題ない。 開きと閉じが対応していれば、余計な括弧を入れても良いという例である。 この例は自明であまり意味がないが、実際の場面では複雑な 条件式 を書く場合などに、 このような優先順位を明示するための(実際には不要な)括弧を書く場合がある。

三つめはすでに見た例である。

以下の計算結果を表示するプログラムを書け。

$$ \begin{align} & 5 + 3 \\ & 3 - 10 \\ & 20 - ( 3 \times 4 ) \\ & 5 \times (-3) \\ & 5 + \left\{ \frac{3}{4} \times (4 - 2) \right\} \\ & 2^{-3} \end{align} $$

実行結果

変数を使った計算

計算結果を変数に代入したい場合は、数値の代わりに式を書けばよい。 初期化に式を使うこともできる。 以下はいずれも正しい書きかたである。

let a;
a = 10 + 20;

let b = 50 / 3;

変数を使った計算もできる。

let a = 5;
let b = 3;

console.log(a + b);
console.log(a - b);
console.log(a * b);
console.log(a / b);
console.log(a % b);
console.log(a ** b);

変数と数値との計算ももちろん可能である。

let a = 5;

console.log(a + 3);
console.log(a - 3);
console.log(a * 3);
console.log(a / 3);
console.log(a % 3);
console.log(a ** 3);

新しい変数を作って、それに入れることもできる

let a = 5;
let b = 3;

// もちろん
//   let calc1;
//   calc1 = a + b;
// などと書くこともできる
let calc1 = a + b;
let calc2 = a - b;
let calc3 = a * b;
let calc4 = a / b;
let calc5 = a % b;
let calc6 = a ** b;

console.log(calc1);
console.log(calc2);
console.log(calc3);
console.log(calc4);
console.log(calc5);
console.log(calc6);

この辺は通常の数学とほぼ同様である。

変数を使った計算を実際にやってみよ。

実行結果

代入演算子

= は代入演算子 (名前は覚えなくてもよい) と呼ばれ、これも演算子として扱われる。 意味はすでに学んだ通りである。

さらに特別な演算子として、複合代入演算子がある (名前は覚えなくてもよい)。 a += 10 と書くと、 a = a + 10 の意味になる。

  • +=

  • -=

  • *=

  • /=

  • %=

  • **=

がある。いずれも意味は自明であろう。

次のプログラムを実行するとどのようになるか考えよ。 その後、実際に実行して、予想通りだったか確認せよ。

let a = 12;
let b = 10;

a += 2;
console.log(a);

a -= 3;
console.log(a);

a *= 2;
console.log(a);

a /= 10;
console.log(a);

a += b;
console.log(a, b);

実行結果

インクリメント演算子・デクリメント演算子

1 を足す、というのはしばしば必要になるので、 a++ という書き方もある (ない言語もある)。 これは a = a + 1 と同等である。 特に ループ で良く使われる。

同様に 1 を引くというのは a-- と書ける。

これらは変数に対してしか適用できない (2-- は $2 = 2 - 1$ となるが、これが意味をなさないのは明らかだろう)。

従って以下は全て同じ意味となる。

a = a + 1;
a += 1;
a++;
++a;	// 次で説明する

前置と後置

++-- は前置と後置があり、動作が異なる。 ざっくり言うと、 a++a値を使ってから a を増加させる。 ++aa増加させてから a の値を使う。

let a;
let b;

// 後置の例
b = 10;
a = b++;
console.log(a, b);

// 前置の例
b = 10;
a = ++b;
console.log(a, b);

一つ目 (a = b++;) は、

a = b;
b = b + 1;

と同等であり、二つ目 (a = ++b;) は、

b = b + 1;
a = b;

と同等である。

次のプログラムを実行してみよ。 どのような結果が出たか、なぜそのようになったか考えてみよ。

let a;
let b;

// 後置の例
b = 10;
a = b++;
console.log("a = ", a);
console.log("b = ", b);

console.log("-----");	// ただの区切り

// 前置の例
b = 10;
a = ++b;
console.log("a = ", a);
console.log("b = ", b);

実行結果

但しこのような書き方は時に混乱の原因となるので、最初のうちは単独で使う方が良いだろう。 例えば、

let a;
let b;

// 後置の例
b = 10;
a = b;
b++;	// ++b; でもよい
console.log(a, b);

// 前置の例
b = 10;
++b;	// b++; でもよい
a = b;
console.log(a, b);

などのように。

また、前置演算子の利用頻度は比較的低い。

文字列

既に変数でも述べたように、文字列にも + が使え、これは連結を意味する。 += も使える。

文字列に対して - は使えない。

文字列と数値に対して + (例えば "abc" + 1) を使うこともできるが、言語のよって動作が異なったりするなど間違いを犯しやすいので、 このような書き方は避けるべきである。

演算子の優先順位

詳細は割愛するが、以下を押さえておけばひとまずよいだろう。 要は数学の場合と大体同じである。

優先度が高いものから順に、

  • ()

  • **

  • *, /, % (% は割り算の一種と考えるとよい)

  • +, -

  • =, +=, -=, *=, /=, %=, **=

  • ** を除き、同じ優先度のものが並んでいる場合は、左側が優先。 例えば

    10 / 2 * 3
    

    は左側にある / が優先されるので (10 / 2) * 3 と同じであり、 10 / (2 * 3) ではない

  • ** が並んでいる場合は右側が優先。 例えば

    a ** b ** c
    

    a ** (b ** c) と等価である ((a ** b) ** c ではない)。 ただしこの場合は、曖昧さや間違いを避けるために、常に (...) を使うのが望ましい。

他にも色々ルールがあるのだが、まずはこれらのことを覚えておけば良いだろう。

まとめ

このページでは重要な算術演算子について学んだ

  • 四則演算 (+, -, *, /), 剰余 (%), べき乗 (**)

  • 複合代入演算子 (+=, -=, *=, /=, %=, **=)

  • インクリメント演算子・デクリメント演算子 (++. --)

  • 演算子には優先順位がある。 優先順位を変えたいときは () が使える (通常の数学とほぼ同一)