Zig 演算子

演算子と式は、プログラミング言語においてさまざまな操作を実行するための基本的な構成要素です。

Zigでは、演算子は算術演算子、関係演算子、論理演算子、ビット演算子、代入演算子、その他の演算子など、いくつかのカテゴリに分類できます。

以下は、各種演算子の詳細な説明と例です。

算术运算符

运算符描述
+加法
-减法
*乘法
/除法
%剰余(モジュロ演算)

实例

const std = @import("std");

pub fn main() void {
    const a: i32 = 5;
    const b: i32 = 3;
   
    const add: i32 = a + b;
    const subtract: i32 = a - b;
    const multiply: i32 = a * b;
    const divide: i32 = a / b;
    const remainder: i32 = a % b;
   
    std.debug.print("a + b = {}\n", .{add});
    std.debug.print("a - b = {}\n", .{subtract});
    std.debug.print("a * b = {}\n", .{multiply});
    std.debug.print("a / b = {}\n", .{divide});
    std.debug.print("a % b = {}\n", .{remainder});
}

コンパイル出力結果は:

a + b = 8
a - b = 2
a * b = 15
a / b = 1
a % b = 2

关系运算符

运算符描述
==等于
!=不等于
>大于
<小于
>=大于等于
<=小于等于

实例

const std = @import("std");

pub fn main() void {
    const a: i32 = 5;
    const b: i32 = 3;

    const equal: bool = a == b;
    const not_equal: bool = a != b;
    const greater: bool = a > b;
    const less: bool = a < b;
    const greater_equal: bool = a >= b;
    const less_equal: bool = a <= b;

    std.debug.print("a == b: {}\n", .{equal});
    std.debug.print("a != b: {}\n", .{not_equal});
    std.debug.print("a > b: {}\n", .{greater});
    std.debug.print("a < b: {}\n", .{less});
    std.debug.print("a >= b: {}\n", .{greater_equal});
    std.debug.print("a <= b: {}\n", .{less_equal});
}

コンパイル出力結果は:

a == b: false
a != b: true
a > b: true
a < b: false
a >= b: true
a <= b: false

逻辑运算符

运算符描述
and論理積
or逻辑或
!逻辑非

实例

const std = @import("std");

pub fn main() void {
    const a: bool = true;
    const b: bool = false;

    const and_result: bool = a and b;
    const or_result: bool = a or b;
    const not_result: bool = !a;

    std.debug.print("a and b: {}\n", .{and_result}); // false
    std.debug.print("a or b: {}\n", .{or_result}); // true
    std.debug.print("!a: {}\n", .{not_result}); // false
}

コンパイル出力結果は:

a and b: false
a or b: true
!a: false

位运算符

运算符描述
&ビットごとのAND
|按位或
^按位异或
~按位取反
<<左移
>>右移

实例

const std = @import("std");

pub fn main() void {
    const a: i32 = 5;  // 0101
    const b: i32 = 3;  // 0011

    const bit_and: i32 = a & b;      // 0001
    const bit_or: i32 = a | b;       // 0111
    const bit_xor: i32 = a ^ b;      // 0110
    const bit_not: i32 = ~a;         // 11111111111111111111111111111010
    const left_shift: i32 = a << 1;  // 1010
    const right_shift: i32 = a >> 1; // 0010

    std.debug.print("a & b: {}\n", .{bit_and});
    std.debug.print("a | b: {}\n", .{bit_or});
    std.debug.print("a ^ b: {}\n", .{bit_xor});
    std.debug.print("~a: {}\n", .{bit_not});
    std.debug.print("a << 1: {}\n", .{left_shift});
    std.debug.print("a >> 1: {}\n", .{right_shift});
}

コンパイル出力結果は:

a & b: 1
a | b: 7
a ^ b: 6
~a: -6
a << 1: 10
a >> 1: 2

赋值运算符

运算符描述
=赋值
+=加法赋值
-=减法赋值
*=乘法赋值
/=除法赋值
%=取余赋值
&=ビット論理積代入
|=按位或赋值
^=ビットごとのXOR代入
<<=左移赋值
>>=右移赋值

实例

const std = @import("std");

pub fn main() void {
    var a: i32 = 5;
    const b: i32 = 3;

    a += b; // 相当于 a = a + b;
    std.debug.print("a += b: {}\n", .{a});

    a -= b; // 相当于 a = a - b;
    std.debug.print("a -= b: {}\n", .{a});

    a *= b; // 相当于 a = a * b;
    std.debug.print("a *= b: {}\n", .{a});

    a = @divTrunc(a, b); // 相当于 a = a / b;
    std.debug.print("a /= b: {}\n", .{a});

    a = @mod(a, b); // 相当于 a = a % b;
    std.debug.print("a %= b: {}\n", .{a});

    a &= b; // 相当于 a = a & b;
    std.debug.print("a &= b: {}\n", .{a});

    a |= b; // 相当于 a = a | b;
    std.debug.print("a |= b: {}\n", .{a});

    a ^= b; // 相当于 a = a ^ b;
    std.debug.print("a ^= b: {}\n", .{a});

    a <<= 1; // 相当于 a = a << 1;
    std.debug.print("a <<= 1: {}\n", .{a});

    a >>= 1; // 相当于 a = a >> 1;
    std.debug.print("a >>= 1: {}\n", .{a});
}

コンパイル出力結果は:

a += b: 8
a -= b: 5
a *= b: 15
a /= b: 5
a %= b: 2
a &= b: 2
a |= b: 3
a ^= b: 0
a <<= 1: 0
a >>= 1: 0

其他运算符

运算符描述
++自增
--自减

实例

const std = @import("std");

pub fn main() void {
    var a: i32 = 5;

    a += 1; // Zig 中没有 ++ 运算符,可以用 += 1 替代
    std.debug.print("a += 1: {}\n", .{a});

    a -= 1; // Zig 中没有 -- 运算符,可以用 -= 1 替代
    std.debug.print("a -= 1: {}\n", .{a});
}

コンパイル出力結果は:

a += 1: 6
a -= 1: 5

演算子の優先順位

以下は、Zigの演算子の優先順位のリストを、高い順から低い順に並べたものです。

优先级运算符描述
1[]添字操作、配列またはポインタアクセス
1.成员访问
2fn_call()函数调用
2@builtin()組み込み関数の呼び出し
3!错误传播
3?可选值解包
4* &ポインタの間接参照とアドレス操作
5+ -単項の正号と負号
6~按位取反
7* / %乗算、除算、剰余
8+ -加法、减法
9<< >>ビット左シフト、右シフト
10&ビットごとのAND
11^按位异或
12``
13== !=等しい、等しくない
13< <= > >=小なり、小なりイコール、大なり、大なりイコール
14and論理積
15or逻辑或
16orelseまたは別の値を返す
17catch捕获错误
18=赋值
19->クロージャの関数本体または戻り値の型指示子

说明:

  • 结合性通常、Zigの演算子は左結合ですが、演算子の具体的な機能に応じてドキュメントを参照できます。
  • 注意事项Zigの演算子はシンプルで明確に設計されており、多くの言語に見られる複雑な暗黙の動作(暗黙の型変換がないことなど)を避けています。

以下の例は、演算子の優先順位が式の評価順序にどのように影響するかを示しています。

实例

const std = @import("std");

pub fn main() void {
    const a: i32 = 5;
    const b: i32 = 3;
    const c: i32 = 2;

    // 乘法优先于加法
    const result1: i32 = a + b * c; // 5 + (3 * 2) = 11
    std.debug.print("a + b * c = {}\n", .{result1});

    // 使用圆括号改变优先级
    const result2: i32 = (a + b) * c; // (5 + 3) * 2 = 16
    std.debug.print("(a + b) * c = {}\n", .{result2});

    // 比较运算符优先于逻辑运算符
    const result3: bool = a > b and b > c; // (5 > 3) and (3 > 2) = true
    std.debug.print("a > b and b > c = {}\n", .{result3});

    // 論理否定は論理積より優先される
    const result4: bool = !(a > b) and b > c; // !(5 > 3) and (3 > 2) = false
    std.debug.print("!(a > b) and b > c = {}\n", .{result4});
}

コンパイル出力結果は:

a + b * c = 11
(a + b) * c = 16
a > b and b > c = true
!(a > b) and b > c = false
其他扩展