ざっくりZig - 判断と振り分け (if, switch)

2024/03/21に公開

プログラミングでは、ある条件に基づいて判断し処理を振り分けるという処理をよく行います。Zigではこれを2つの形式で実行できます。代入や演算のときに行うものは (expression)、処理のときに行うものは (statement)といいます。

条件式

プログラミングにおける判断の方法として条件式というものがあります。条件式とは、どのような条件をもとに判断するかを表すものです。結果は条件に適っていれば true 、そうでなければ false となります。この2つは bool という型の値です。

条件式は 論理演算子 と呼ばれる記号を組み合わせて表します。

論理演算子 内容
! !a aの結果の逆
== a == b aとbは等しいか
!= a != b aとbは等しくないか
> a > b aはbより大きいか
>= a >= b aはb以上か
< a < b aはbより小さいか
<= a <= b aはb以下か
and a and b aでありbである
or a or b aもしくはb
条件式の例
const a: u8 = 1;
const b: u8 = 2;

a < 2   // true
b > 1   // true
a < b   // true
a > b   // false

a > 1 or b > 1      // true
a > 1 and b > 1     // false
!(b > 1 and b < 3)  // false

ifによる処理の変更

条件式がよく使われるものとして if があります。これは条件式の結果がtrueの時とfalseの時とで内容が変わることを表します。ifには式と文があります。式は条件式の結果をもとに値が得られるもので、文は条件式の結果をもとに、その後行う処理の内容を変えるものです。式の場合は最後に;(セミコロン)が必要な場合がありますので注意してください。

if式
// 代入の場合
変数 = if (条件式) ...条件式の結果がtrueの時の値... else ...条件式の結果がfalseの時の値...;
if文
// ... 処理の途中 ...
if (条件式) {
    // 条件式の結果がtrueの時の処理
}
else {
    // 条件式の結果がfalseの時の処理 (else { ... }は省略可)
}
const std = @import("std");
const stdout = std.io.getStdOut().writer();

const a = ...;

// if式
const s = if (a % 2 == 0) "偶数" else "奇数";
try stdout.print("{}は{s} です\n", .{a, s});

// if文
if (a % 2 == 0) {
    try stdout.print("{}は{s}です\n", .{a, "偶数"});
}
else {
    try stdout.print("{}は{s}です\n", .{a, "奇数"});
}

変数にオプションがついているときのif

変数にオプションがついているときは、単純に変数の値がnullであるかを判定することもできますが、それ以外に変数の値を直接参照する方法もあります。

var v: ?u8 = null;
v = .....;
// 変数の値がnullでないことを確認
if (v != null) {
    try stdout.print("v = {}\n", .{v.?});
}
else {
    // .....
}

// 変数の値がnullでないときにその値を参照
if (v) |w| {   // wはv.?の値
    try stdout.print("v = {}\n", .{w});
}
else {
    // .....
}

switchによる振り分け

変数の値に応じて2つ以上の振り分けを行う場合は switch を使います。こちらもswitch式とswitch文があります。switchでは複数の選択肢を 値の候補 => 結果となる値もしくは{ 処理 } のようにもうけたあと、**else =>**で選択肢に当てはまらない場合についても記しておきます。結果や処理の最後にカンマ(,)をつけます。最後の選択肢につけてあっても受け付けます。

値の候補は、単独(a)、カンマ区切り(a, b, c)、範囲(a...b: a, bともに含む)のいずれかです。(その他は別途紹介予定)

swith式
switch (変数名) {   // 変数にオプションがあるときは 変数名.?
    値の候補 => 結果となる値,
    .......
    else => 選択肢に当てはまらないときの値
}
switch文
switch (変数名) {   // 変数にオプションがあるときは 変数名.?
    値の候補 => {
        // ...処理...
    },
    else => {
        // ...選択肢に当てはまらないときの処理...
    }
}
// switch式
var a: u8 = .....;
var v: u8 = switch (a) {
    1, 2, 3 => 10,  // aの値が1, 2, 3のいずれかのとき v = 10
    4...6 => 20,    // aの値が4~6のとき    v = 20
    7 => 30,        // aの値が7のとき   v = 30
    else => 0,      // aの値がどの選択肢にも当てはまらないとき v = 0
};

// switch文
var v: ?u8 = .....;
switch (v.?) {  // vにオプションがつけられているとき
    1, 2, 3 => {    // vの値が1, 2, 3のいずれかのとき
        try stdout.print("Low\n", .{});
    },
    4...6 => {  // vの値が4~6のとき
        try stdout.print("High\n", .{});
    },
    7 => {  // vの値が7のとき
        try stdout.print("Lucky\n", .{});
    },
    else => {},   // vの値が選択肢にも当てはまらないとき 
}

まとめ

  • if
    • 条件式の結果はbool型の値であるtrue, falseで表される
    • 条件式は論理演算子を組み合わせて表す
    • ifにより条件式の結果に基づいて、この後行う処理を変更できる
    • if式とif文があり、if式は条件式の結果に応じた値が返され、if文は条件式の結果に応じて処理の内容を変えられる
    • 変数にオプションがついているときは直接変数の値を参照する方法がある (if (v) |w| { ... })
  • switch
    • switchによる振り分けでは複数の選択肢を用意し、そのどれにも当てはまらない場合をelseの後に記しておく
    • switchにも式と文がある

繰り返し (while, break, continue) >
< 変数の値を変更 (var, null, undefined)
ざっくりZig 一覧

Discussion