【PowerShellでやさしいプログラミング】第4回:式と演算子

こんにちは、けいぞうです。

「1 + 1 = 2」
これはです。

当たり前だのダノンシャークですかね。
※ダノンシャーク:日本の競走馬

さらに、式の中に使われている「+」を演算子と呼びます。

プログラミングではこの演算子を駆使して様々な処理を書いてきます。
演算子はプログラミングの重要な要素のひとつなんです。

今回はこの演算子について学んでいきましょう。

数値の足し算

前回の「変数」の記事で、
変数の型には文字列数値など様々なものがあると説明しました。

演算子の利用例として最も分かりやすいのが、
数値と数値を足したり引いたりする演算、いわゆる足し算引き算です。

PowerShellのウィンドウに、以下のように書いてみてください。

1 + 2

「3」と表示されましたよね。
1という数値と2という数値を加算するという演算が行われたからです。

皆がよく知っている算数の「+」と同じように、プログラミングの世界でも「+」は数値と数値の加算を行ってくれる演算子になるのです。

ちなみに、「+」や「-」で演算の対象となるもののことを「オペランド」と呼びます。
「1 + 1 = 2」 の場合は12オペランドですね。

演算子の種類

プログラミングで使う演算子は「+」以外にもたくさんあります。
以下にPowerShellで使用できる演算子をまとめました。

演算子意味
+足し算/文字列結合
引き算
*掛け算
/割り算
%割り算のあまり(モジュロ演算)
[Math]::Pow(a,b) べき乗(aのb乗)
=代入
++インクリメント
– –デクリメント

※PowerShellの演算子と書きましたが、他のプログラミング言語でもほぼ同じです。(べき乗だけはちょっと違うかも)

「+」足し算/文字列結合

「+」はオペランドの型が数値の場合は足し算を、オペランドの型が文字列だった場合はその文字列の結合をします。

数値の場合

> 1 + 1
2

> 1.4 + 1.2
2.6

文字列の場合

>”1″ + “1”
11

>”PowerShell” + “アツイ”
PowerShellアツイ

「-」引き算

マイナス記号で、数値同士の引き算の演算になります。

>5 – 3
2


日付型(datetime型)同士の引き算をすると、その日付間が何日なのかとか、何時間なのか等を表すTimespan型として、結果が返ってきます。

例えば、このような2つのdatetime型の変数があったとします。

>$date1
2020年7月25日 0:00:00
>$date2
2020年7月24日 18:33:34

この2つの引き算をすると・・・?

こんな結果になります。

$date1と$date2の差が、あと何日なのか、何時間なのかという情報が入っていますね。

例えば、後何時間なのかだけを取り出したい場合は、以下のように書きます。

「*」掛け算

数値同士の掛け算は「*」(アスタリスク)を使います。

>5 * 2
10

「/」割り算

数値同士の割り算は「/」スラッシュを使います。

>6 / 3
2

「%」割り算のあまり(モジュロ演算)

「%」を使うと、数値同士の割り算のあまりを出してくれます。
いわゆるモジュロ演算です。

>6 % 4
2

他のプログラミング言語や数学では「mod」と書くこともあることから、
このモジュロ演算のことを「モッド」と呼ぶことも多いです。

[Math]::Pow(a,b) 」 べき乗 (aのb乗)

[Math]::Pow(a,b)」と書くと、aのb乗を計算してくれます。

>[Math]::Pow(5,2)
25

~補足~

他の演算子とこれだけちょっと見た目が違いますね。
厳密に言うと、これは演算子ではなく関数になります。

関数というのは自動販売機のようなものです。

自動販売機はお金を入れてボタンを押すと飲み物が出てきますよね?
このように、何かを入力すると出力が得られるもののことを、一般的に関数と呼びます。

自動販売機

関数

関数の場合、入力に渡すものを「引数(ひきすう)」、
出力で出てくるものを「戻り値(もどりち)」と呼びます

今回のPow(a,b)の場合は、aとbが引数、計算結果のaのb乗が戻り値です。

「=」代入

プログラミングの「=」と算数や数学の「=」は意味が異なるので注意です!

算数や数学ではこのイコール記号は”等号”を意味して、左右のオペランドが同じですよーという意味になりますが、

プログラミングの場合は、
左のオペランドに、右のオペランドの値を入れる
という意味になります。

この操作を代入と呼びます。

「++」インクリメント

インクリメントは数値に1を加えるという操作です。

例えば、0を代入した$aに一回インクリメントすると、1になります。

>$a = 0
>$a++
>$a
1

「- – 」デクリメント

デクリメントはインクリメントの逆で、数値から1減らすという操作です。
ちょっと見づらいですが、「-」(ハイフン)を2回続けて書くとデクリメントを意味します。

例えば、2を代入した$bに一回デクリメントすると、1になります。

>$b = 2
>$b
— #ハイフンを2回続けて
>$b
1


演算子はこれくらいを覚えていればほぼ100%オッケーです。

ちなみに、今回紹介した演算子の中でも、
「=」は代入演算子の仲間で、
それ以外は算術演算子の仲間になります。

演算子には他にも比較演算子論理演算子シフト演算子と言ったものがあります。
(シフト演算子は今時つかう場面はないかも・・・。)

比較演算子や論理演算子はよく使いますので、以下の記事にまとめてます
要チェック!!

ちなみに、この比較演算子と論理演算子については、
PowerShellの記述方法は他のプログラミング言語と比べて少し異質です。

使い方は同じなんですが、書き方が特殊ですので、
一度覚えたら忘れないんじゃないかなあ。

型の異なるオペランド同士の演算

先ほどまでは、数値同士文字列同士を演算を紹介しました。

演算子の中には型の異なるオペランド同士を演算すると、また違った挙動をするものがあるので、その一部を紹介します。

文字列 * 数値

「文字列 * 数値」を実行すると、文字列をその数値文だけ結合してくれます。

>”カツカレー” * 3
カツカレーカツカレーカツカレー

ちなみに、数値の方を小数にすると、四捨五入されて扱われます。

>”カツカレー” * 1.4
カツカレー
>”カツカレー” * 1.5
カツカレーカツカレー

日付型 + 数値

「日付型 + 数値」を実行すると、その日付型に秒・分・時間を加えることが出来ます。

>$a = Get-Date #2020年7月24日 17:29:40
>$a + 10000000
2020年7月24日 17:29:41

10,000,000足すことで1秒となるようです。

型の変換

「+」の演算子の部分で気づいた方もいると思いますが、同じ「1+1」でも、型が数値の場合と、文字列の場合で結果が異なります。

1」の型が数値の場合は結果が「2」に
1」の型が文字列の場合は結果が「11」になります。

数値として扱うか、文字列として扱うかは””(ダブルクオーテーション)で括るかどうかで区別することができましたよね。

>1+1
2

>”1″ + “1”
11

では、あらかじめ変数に代入されている文字列を数値として足し算したい場合はどうしたらよいでしょうか?

>$a = “1”
>$b = “2”
# $aと$bを数値として足し算したい場合は・・・

この場合は、文字列として扱われている変数を数値型(今回の場合は特に整数型になる)に型変換してあげればよいです。

int型への変換は以下のように実施します。

>$a = [int]$a
>$b = [int]$b

string型への変換も同様の形で行えます。

>$a = [string]$a
>$b = [string]$b

このように、型を明示的に指定して変換することを「キャスト」と呼びます。
JavaやC#と言った他の言語にはキャストではない変換の方法があったりしますが、一旦はこれだけ覚えておけばOKでしょう。

練習問題

問題1

3つの数値を入力させ、その合計を表示するプログラムを作りましょう。

問題2

三角形の底辺の長さと高さを入力させ、その面積を表示するプログラムを作りましょう
※三角形の面積の求め方は[底辺 × 高さ ÷ 2]

問題3

未来の年月日を入力して、その日が今日から「何日後」なのかを表示するプログラムを作りましょう

答え1

答え2

答え3