今回は式と演算子についてや使い方を説明していきます。
式といえば数学で使う「1+1」や「x + y」などの計算の記号を数字や文字で繋いだものを想像しますが、プログラミングでは数値や文字、変数そのものも式となります。
+やー、=などの記号を演算子と呼び、演算子を使った計算などの処理を演算と呼びます。それは、コンピューターの機能に演算という機能があり、数値の比較なども演算に含むから演算と呼ぶようです。加減乗除は四則演算と呼びます。
オペランド
1という整数値や”PHP”と言った文字列もそれぞれの値を評価し、それぞれの値を返す式となります。このようなリテラルは式の中で使う場合オペランドと呼ばれ、変数もオペランドに含まれます。
オペランド同士を組み合わせて式を作ることができ、その場合に演算子を使用します。
たくさんある演算子の種類を覚えよう
演算子は以下の通りです。
- 算術演算子
- インクリメント/デクリメント演算子
- 代入演算子
- 比較演算子
- 条件演算子
- 論理演算子
- ビット演算子
- 文字列結合演算子
それぞれの演算子について説明していきます。
算術演算子
算術演算子とは四則演算と割り算した後の余りを求める演算子があります。
<?php
$add = 1 + 2;
$sub = 2 - 1;
$mul = 1 * 1;
$div = 2 / 1;
$rem = 3 % 2;
print $add.$sub.$mul.$div.$rem; // 11111
?>
インクリメント/デクリメント演算子
インクリメント演算子は変数の値を1増やし、デクリメント演算子は1減らします。プログラミングでは繰り返しの処理を行う時、規定回数を設定する場合が多いです。そんな時、何回目の処理か数える時にインクリメント演算子でとある変数に1ずつ増やします。また逆にデクリメント演算子を用いて1ずつ減らしていくこともあります。使い方は変数の前後にくっつけます。
++$num; //変数の前にくっつける
$num--; // 変数の後ろにくっつける
前後どちらにくっつけても1増減しますが、前に付けると処理を行う前に1増減し、後ろに付けると処理を行った後に1増減します。実際に出力させて確かめてみましょう。
<?php
$num = 0;
print ++$num; //出力される前に増える
print ", ";
print $num--; //出力されてから減る
print ", ";
print $num;
?>
インクリメント演算子を$numの前に付けて出力すると、$numの値が1増えてから出力されてますね。その下ではデクリメント演算子を$numの後ろに付けているので、1減るのは処理された後ですから表示されるのは1なのですね。処理された後には1減ってるので、続けて$numを単に出力すると0が表示されてます。
代入演算子
代入演算子には単純代入演算子「=」と、「+=」のように他の演算子と一緒に使う複合代入演算子があります。どちらの代入演算子も共通することは右辺を左辺に値を代入することです。
単純代入演算子は右辺をそのまま左辺に代入するので右辺と左辺は同じ値になります。
複合代入演算子は、左辺の値と右辺の値を演算した結果を、左辺に再代入します。
<?php
$num = 1;//$numに1をそのまま代入します。
print $num; //1
$num += 1;//$numと右辺の値を+した値が$numに再代入されます。
print ', ';
print $num; //2
print ', ';
print $num .= 1; //左辺の値に右辺の値を結合された値なので21となる。
?>
ちなみに上記の複合演算子は$num = $num + 1;を簡略化した書き方です。
多重代入
代入演算子は「$x = $y = $z」というようにいくつも記述することができます。これを多重代入と呼び一番右側の代入から左へ処理されていきます。もちろん複合代入演算子も使用できます。以下のように使用します。
<?php
$num = 1;
$x = $y = $num; // $x,$y共に1が代入される。
print $x;
print '<br>';
print $y;
print '<br>';
$i = 2;
$j = 3;
$i += $j += $num; //
print $i;// 6
print '<br>';
print $j;// 4
print '<br>';
$i = $j += $num;
print $i;// 5
print '<br>';
print $j;// 5
?>
参照の代入
今まで見てきた代入は、値を直接変数に代入するものでした。これに対して参照の代入というものがあります。
メモリとアドレス
変数に値を代入する時、その値を格納するためのメモリ領域が割り当てられています。$num = 1のように変数に値を代入して初期化しますと、メモリ上に1という値を格納する領域が割り当てられ、その割り当てられた住所(メモリアドレス)が$numに保存されているのです。$numを出力するとまずその住所の値を見に行き、そこには1という値が格納されていますので、1が出力されます。
$num1 = $num2とすると、$num1には$num2のアドレスに格納されている値がコピーされるので、$num1と$num2の値が同じになります。
参照の代入はメモリ上のアドレスを代入すること
参照の代入とは、見に行くメモリ上のアドレスごと代入することです。参照の代入を行うには変数の前に「&」を付けます。
以下のコードを見てください。
<?php
$num1 = 1;
$num2 = 2;
$num1 = &$num2;
$num2 = 3;
print $num1; //3
print ',';
print $num2; //3
?>
1度$num1に1を代入しましたが、その直後$num2の参照元を代入しましたので、$num2の値が変わると1を代入していた$num1の値も$num2と同じ値になっていますね。$num1と$num2の住所が同じになったので、その後はどちらかに値を代入すると、同じアドレスを参照している変数の値も変化します。
比較演算子
演算の対象であるオペランドの関係を見るための比較演算子には以下のものがあります。
演算子 | 内容 |
== | 値が等しい |
=== | 値が等しくデータ型が一致 |
!= , <> | 値が異なる |
!== | 値またはデータ型が異なる |
> | 左辺が右辺より大きい |
< | 左辺が右辺より小さい |
>= | 左辺が右辺以上 |
<= | 左辺が右辺以下 |
これらの演算子を用いた式を関係式と呼び、その関係式の演算結果はTRUEまたはFALSEの論理値となります。関係式が成り立っていればTRUE,成り立っていなければFALSEとなります。
$num = 1;
var_dump($num > 0); //bool(true)
var_dump($num > 2); //bool(false)
==と===、!=と!==それぞれの違い
1つ「=」が多い方の演算子は値だけでなく、左辺と右辺のデータ型も比較します。
$num = '123';
var_dump($num == 123);//bool(true)
var_dump($num === 123);//bool(false)
$num = '1.23';
var_dump($num != 1.23);//bool(false)
var_dump($num !== 1.23);//bool(true)
このように「==」では文字列と数値と異なっていても同じであると判定しますが、「===」はデータ型が異なるのでfalseと判定しています。
論理演算子
論理演算子とは、複数の関係式を用いた演算の結果をtrue/falseで値を返します。また、評価の結果のtrueやfalseを反転させる演算子もあります。
演算子 | 内容 |
$$ | 左辺の関係式の値と右辺の関係式の値が共にTRUEの時、TRUEを返す |
|| | 左辺の関係式の値と右辺の関係式の値どちらかがTRUEの時、TRUEを返す |
! | 値がtrueの場合false、falseの場合trueを返す |
<?php
$a = 1;
$b = 2;
$c = 3;
$d = 4;
$bool = true;
var_dump($a < $b && $c < $d);// true
var_dump($a > $b && $c < $d);// false
var_dump($a < $b || $c > $d);// true
var_dump($a > $b || $c > $d);// false
var_dump(!$bool);// false
?>
上記のコードでそれぞれの論理演算子の結果の値がどうなるか分かりますね。
ビット演算子
ビット演算子は整数の値に対してビット単位で処理を行うための演算子です。ビット演算などと言われてもピンと来ない人もいるかと思いますがあまり使うことはありません。しかし、身近なとこですとネットワークアドレスにもビット演算が使われていますし、もしかするとビット演算を使う機会があるかもしれませんので、触り程度で学習しときましょう。
演算子 | 内容 |
& | ビットごとのAND演算を行います。同じ位置のビットがどちらも1であれば1を返します。 |
| | ビットごとのOR演算を行います。同じ位置のどちらかに1があれば1を返します。 |
^ | ビットごとのXOR演算を行います。同じ位置のビットが異なる場合1を返します。 |
~ | ビットの反転を行う。ビットが1なら0、0なら1を返します。 |
16進数の5Aと11で説明していきます。16進数は0xで表します。また、ビット演算なので下記は2進数で表しています。
var_dump(0x5A & 0x11);//int(16)
0101 1010 (0x5A)
0001 0001 (0x11)
-----------------
0001 0000 (0x10) ←int(16)
var_dump(0x5A | 0x11);//int(91)
0101 1010 (0x5A)
0001 0001 (0x11)
-----------------
0101 1011 (0x5B) ←int(91)
var_dump(0x5A ^ 0x11);//int(75)
0101 1010 (0x5A)
0001 0001 (0x11)
-----------------
0100 1011 (0x4B) ←int(75)
$a = 0x5A;
var_dump(~$a);//int(165)
0101 1010
---------
1010 0101 ←int(165)
コメント