第5章 演算子
5.1 算術演算子
| 演算 | PHP | TypeScript | VB.NET |
|---|---|---|---|
| 加算 | + |
+ |
+ |
| 減算 | - |
- |
- |
| 乗算 | * |
* |
* |
| 除算 | / |
/ |
/ |
| 整数除算 | intdiv() |
Math.floor(a/b) |
\ |
| 剰余 | % |
% |
Mod |
| 累乗 | ** |
** |
^ |
PHP
<?php
$a = 10;
$b = 3;
echo $a + $b; // 13
echo $a - $b; // 7
echo $a * $b; // 30
echo $a / $b; // 3.333...
echo intdiv($a, $b); // 3(整数除算)
echo $a % $b; // 1
echo $a ** $b; // 1000
// 複合代入演算子
$a += 5;
$a -= 5;
$a *= 2;
$a /= 2;
$a %= 3;
$a **= 2;
// インクリメント/デクリメント
$a++;
++$a;
$a--;
--$a;
TypeScript
const a = 10;
const b = 3;
console.log(a + b); // 13
console.log(a - b); // 7
console.log(a * b); // 30
console.log(a / b); // 3.333...
console.log(Math.floor(a / b)); // 3
console.log(a % b); // 1
console.log(a ** b); // 1000
// 複合代入演算子
let x = 10;
x += 5;
x -= 5;
x *= 2;
x /= 2;
x %= 3;
x **= 2;
// インクリメント/デクリメント
x++;
++x;
x--;
--x;
VB.NET
Dim a As Integer = 10
Dim b As Integer = 3
Console.WriteLine(a + b) ' 13
Console.WriteLine(a - b) ' 7
Console.WriteLine(a * b) ' 30
Console.WriteLine(a / b) ' 3.333...(Double)
Console.WriteLine(a \ b) ' 3(整数除算)
Console.WriteLine(a Mod b) ' 1
Console.WriteLine(a ^ b) ' 1000(Double)
' 複合代入演算子
a += 5
a -= 5
a *= 2
a /= 2 ' 注意:結果は Double になりうる
a \= 2 ' 整数除算の複合代入
a ^= 2
' VB.NET にはインクリメント演算子がない
a = a + 1 ' または a += 1
5.2 比較演算子
等価比較
| 演算 | PHP | TypeScript | VB.NET |
|---|---|---|---|
| 等しい(緩い) | == |
== |
= |
| 等しい(厳密) | === |
=== |
=(型は静的) |
| 等しくない(緩い) |
!=, <>
|
!= |
<> |
| 等しくない(厳密) | !== |
!== |
<> |
PHP
<?php
// 緩い比較(型変換あり)
var_dump(1 == "1"); // true
var_dump(0 == ""); // true
var_dump(0 == "abc"); // true(PHP 7)/ false(PHP 8)
var_dump(null == false); // true
// 厳密比較(型も比較)
var_dump(1 === "1"); // false
var_dump(1 === 1); // true
// 宇宙船演算子(PHP 7+)
echo 1 <=> 2; // -1(左 < 右)
echo 2 <=> 1; // 1(左 > 右)
echo 1 <=> 1; // 0(等しい)
TypeScript
// 緩い比較(非推奨)
console.log(1 == "1"); // true
console.log(0 == ""); // true
console.log(null == undefined); // true
// 厳密比較(推奨)
console.log(1 === "1"); // false
console.log(1 === 1); // true
// TypeScript では === を使うべき
// ESLint: eqeqeq ルールで強制可能
VB.NET
' VB.NET は静的型付けなので厳密比較のみ
Console.WriteLine(1 = 1) ' True
' Console.WriteLine(1 = "1") ' Option Strict On でエラー
' 文字列比較
Dim s1 As String = "Hello"
Dim s2 As String = "Hello"
Console.WriteLine(s1 = s2) ' True(値で比較)
' オブジェクト参照の比較
Dim obj1 As New Object()
Dim obj2 As Object = obj1
Console.WriteLine(obj1 Is obj2) ' True(同じ参照)
Console.WriteLine(obj1 IsNot obj2) ' False
' 文字列の参照比較
Console.WriteLine(s1 Is s2) ' True(インターン化されている場合)
Console.WriteLine(Object.ReferenceEquals(s1, s2)) ' より明示的
大小比較
| 演算 | PHP | TypeScript | VB.NET |
|---|---|---|---|
| より大きい | > |
> |
> |
| より小さい | < |
< |
< |
| 以上 | >= |
>= |
>= |
| 以下 | <= |
<= |
<= |
5.3 論理演算子
| 演算 | PHP | TypeScript | VB.NET |
|---|---|---|---|
| AND |
&&, and
|
&& |
And, AndAlso
|
| OR |
||, or
|
|| |
Or, OrElse
|
| NOT |
!, not
|
! |
Not |
| XOR | xor |
^ (ビット) |
Xor |
短絡評価
<?php
// PHP: && と || は短絡評価
$result = false && expensiveFunction(); // 右辺は評価されない
$result = true || expensiveFunction(); // 右辺は評価されない
// and と or は優先順位が低い
$result = true and false; // $result = true(代入が先)
// TypeScript: 常に短絡評価
const result = false && expensiveFunction(); // 右辺は評価されない
const result2 = true || expensiveFunction(); // 右辺は評価されない
' VB.NET
' And/Or は両辺を評価
Dim result = False And ExpensiveFunction() ' 右辺も評価される
' AndAlso/OrElse は短絡評価
Dim result2 = False AndAlso ExpensiveFunction() ' 右辺は評価されない
Dim result3 = True OrElse ExpensiveFunction() ' 右辺は評価されない
5.4 文字列結合演算子
| 言語 | 結合演算子 | 備考 |
|---|---|---|
| PHP | . |
+ は算術演算 |
| TypeScript | + |
暗黙の型変換あり |
| VB.NET | & |
+ も可能だが & 推奨 |
PHP
<?php
$str = "Hello" . " " . "World";
$str .= "!"; // 複合代入
// 変数展開
$name = "John";
$greeting = "Hello, $name!";
$greeting = "Hello, {$name}!"; // 波括弧あり
TypeScript
const str = "Hello" + " " + "World";
let s = "Hello";
s += "!";
// テンプレートリテラル
const name = "John";
const greeting = `Hello, ${name}!`;
const multiline = `
Line 1
Line 2
`;
VB.NET
Dim str As String = "Hello" & " " & "World"
str &= "!" ' 複合代入
' + も使えるが Nothing との結合で挙動が異なる
Dim s1 As String = "Hello" + Nothing ' 例外の可能性
Dim s2 As String = "Hello" & Nothing ' "Hello"(安全)
' 文字列補間(VB 14+)
Dim name As String = "John"
Dim greeting As String = $"Hello, {name}!"
Dim formatted As String = $"Value: {value:N2}" ' 書式指定
5.5 Null合体演算子
| 言語 | Null合体 | Null条件代入 | Null条件アクセス |
|---|---|---|---|
| PHP | ?? |
??= |
?-> |
| TypeScript | ?? |
??= |
?. |
| VB.NET | If(a, b) |
なし | ?. |
PHP
<?php
// Null合体演算子
$value = $input ?? "default";
$value = $a ?? $b ?? $c ?? "default"; // 連鎖可能
// Null合体代入(PHP 7.4+)
$array['key'] ??= "default";
// Nullsafe演算子(PHP 8.0+)
$result = $obj?->method()?->property;
TypeScript
// Null合体演算子(nullとundefinedのみ)
const value = input ?? "default";
const value2 = a ?? b ?? c ?? "default";
// 注意:|| との違い
const x = 0 || "default"; // "default"(0はfalsy)
const y = 0 ?? "default"; // 0(nullishではない)
// Null合体代入
let obj = { key: undefined };
obj.key ??= "default";
// オプショナルチェイニング
const result = obj?.method?.()?.property;
VB.NET
' If 演算子(三項演算子としても使用)
Dim value As String = If(input, "default")
Dim value2 As String = If(a, If(b, If(c, "default")))
' Null条件演算子(VB 14+)
Dim result = obj?.Method()?.Property
' Null条件付きインデックス
Dim item = array?(0)
' 注意:If 演算子と IIf 関数の違い
' IIf は両方の引数を評価する(非推奨)
Dim bad = IIf(obj IsNot Nothing, obj.Value, "default") ' NullReferenceException の可能性
Dim good = If(obj IsNot Nothing, obj.Value, "default") ' 短絡評価
5.6 三項演算子/If演算子
PHP
<?php
// 三項演算子
$result = $condition ? "yes" : "no";
// Elvis演算子(左辺がfalsyならデフォルト)
$result = $value ?: "default";
// 三項演算子のネスト(括弧推奨)
$result = $a ? "a" : ($b ? "b" : "c");
TypeScript
// 三項演算子
const result = condition ? "yes" : "no";
// ネスト
const result2 = a ? "a" : b ? "b" : "c";
// 型の推論
const value = condition ? 42 : "string"; // number | string
VB.NET
' If 演算子(三項演算子相当)
Dim result As String = If(condition, "yes", "no")
' ネスト
Dim result2 As String = If(a, "a", If(b, "b", "c"))
' 二項形式(Null合体)
Dim value As String = If(nullableValue, "default")
' IIf 関数(レガシー、非推奨)
' 両方の引数が評価されるため副作用に注意
Dim bad = IIf(True, GetValue(), ThrowError()) ' ThrowError() も実行される
5.7 ビット演算子
| 演算 | PHP | TypeScript | VB.NET |
|---|---|---|---|
| AND | & |
& |
And |
| OR | | |
| |
Or |
| XOR | ^ |
^ |
Xor |
| NOT | ~ |
~ |
Not |
| 左シフト | << |
<< |
<< |
| 右シフト | >> |
>> |
>> |
| 符号なし右シフト | なし | >>> |
なし |
<?php
$a = 0b1010; // 10
$b = 0b1100; // 12
echo $a & $b; // 8 (0b1000)
echo $a | $b; // 14 (0b1110)
echo $a ^ $b; // 6 (0b0110)
echo ~$a; // -11
echo $a << 1; // 20
echo $a >> 1; // 5
const a = 0b1010; // 10
const b = 0b1100; // 12
console.log(a & b); // 8
console.log(a | b); // 14
console.log(a ^ b); // 6
console.log(~a); // -11
console.log(a << 1); // 20
console.log(a >> 1); // 5
console.log(a >>> 1); // 5(符号なし)
Dim a As Integer = &B1010 ' 10
Dim b As Integer = &B1100 ' 12
Console.WriteLine(a And b) ' 8
Console.WriteLine(a Or b) ' 14
Console.WriteLine(a Xor b) ' 6
Console.WriteLine(Not a) ' -11
Console.WriteLine(a << 1) ' 20
Console.WriteLine(a >> 1) ' 5