コンテンツにスキップ

演算子

演算子 対応する型 結果・動作
+ - * / % 整数 同じ整数型
単項 - 整数 符号反転
単項 ! 整数、bool ビット反転、論理否定
& | ^ 整数、bool 両辺を評価するビット・真偽値演算
<< >> 整数 左辺の整数型
== != 整数、bool bool
< <= > >= 整数 bool
&& || bool 短絡評価する bool

シフトを除く二項演算は両辺に同じ型が必要です。bool に等値比較は使えますが、大小比較は使えません。

/ は商を負の無限大に向かって丸めます。整数についての Python の // と %に対応する規則です。Python の / のように浮動小数点数を返す演算ではありません。

print -7 / 3, -7 % 3; // -3 2
print 7 / -3, 7 % -3; // -3 -2
print -7 / -3, -7 % -3; // 2 -1

剰余は 0 または除数と同じ符号になります。演算が定義される範囲では、数学的に a = (a / b) * b + a % b を満たします。ただし、この等式を固定幅の整数で計算する際の中間結果まで必ず範囲内になるとは限りません。

開発・最適化ビルドのどちらでも次の状況を検査し、実行時エラーで停止します。

  • +、-、*、単項 - の結果が型の範囲を超える。
  • / または % の除数が 0。
  • 型の最小値を -1 で割る、または最小値の % -1 を求める。
  • シフト量が負、または左辺のビット幅以上。

MIN % -1 もエラーになる点に注意してください。数学上の剰余が 0 であっても、この組み合わせを許可する特例はありません。

シフトは両辺の整数幅が異なっていても使えます。左シフトでは幅からあふれた上位ビットを捨て、右シフトでは符号ビットを補います。シフト量は i32 の左辺なら0以上31以下、i64 なら0以上63以下が有効です。

amount: i64 = 2;
value: i32 = 3;
print value << amount; // 12。結果は i32
print 1 << 31; // -2147483648
print -8 >> 1; // -4

+= -= *= /= %= &= |= ^= <<= >>= を使えます。対象は定義済みの変数に限ります。

右辺をすべて評価したあとで、左辺の変数の現在値を読み、演算して代入します。

x = 10;
x += { x = 2; 1 };
print x; // 3

この例では右辺が x を 2 に変えてから 1 を返すので、計算は 2 + 1 です。通常の x = x + ...; とは副作用の順序が異なる場合があります。

上ほど強く結び付きます。通常の二項演算は左結合、三項演算子は右結合です。

強い順 演算子
1 関数呼び出し、丸括弧によるグループ化
2 単項 - !
3 * / %
4 + -
5 << >>
6 &
7 ^
8 |
9 == != < <= > >=
10 &&
11 ||
12 ?:

比較は連鎖できません。0 <= x < 10 は 0 <= x && x < 10 と書きます。読みやすさのために丸括弧で順序を明示しても構いません。

実装の参照先: 優先順位、演算の型、整数ランタイム。