Skip to content

Instantly share code, notes, and snippets.

@s-hiiragi
Created January 14, 2022 17:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save s-hiiragi/2488eaa6b8d2b8773c13caf1d01f6a90 to your computer and use it in GitHub Desktop.
Save s-hiiragi/2488eaa6b8d2b8773c13caf1d01f6a90 to your computer and use it in GitHub Desktop.
HSPの演算子の優先順位

HSPの演算子の優先順位

演算子の一覧

演算子 種類
+,-,*,/ 加算,減算,乗算,除算
&,|,^ 論理演算(and,or,xor)
\ 割り算の余り
=,<,>,! 条件式(同じ,小さい,大きい,同じでない)
==,<=,>=,!= 条件式2(同じ,以下,以上,同じでない)
<<,>> 左、右方向にビットシフト

公式ドキュメントの優先順位

演算子 優先順位
* / 4(高い)
+ - 3
比較演算子 2
& | ^ 1(低い)

参考

不足している演算子を反映させた優先順位

演算子 優先順位
* / \ 5(高い)
+ - 4
<< >> 3
比較演算子 2
& | ^ 1(低い)

調査に使用したコード

コード一覧

  • 剰余演算子の優先順位.hsp
  • ビット演算子の優先順位.hsp

調査環境

  • Windows 10
  • HSP 3.6
; 式と期待値が一致するか比較するマクロ
; 一致しない場合、式、期待値、実際の値を表示する
;
; 引数
; %1 式
; %2 期待値
;
#define global ASSERT_EQUAL(%1,%2) \
if (%1) != (%2) { \
mes "%1 ;==> expect: %2, actual: " + (%1) : \
__assert_last_error = 1 \
}
#define global ASSERT_FAILED (__assert_last_error)
; シフト演算子とビット論理演算子の優先順位は同じで左結合か?
; ==> 正しくない。シフト演算子は論理演算子よりも優先順位が高い。
ASSERT_EQUAL 1 << 1 & 1, 0
ASSERT_EQUAL (1 << 1) & 1, 0
ASSERT_EQUAL 1 & 1 << 1 , 0
ASSERT_EQUAL 1 & (1 << 1), 0
ASSERT_EQUAL 1 << 1 | 1, 3
ASSERT_EQUAL (1 << 1) | 1, 3
ASSERT_EQUAL 1 | 1 << 1 , 3
ASSERT_EQUAL 1 | (1 << 1), 3
ASSERT_EQUAL 1 << 1 ^ 1, 3
ASSERT_EQUAL (1 << 1) ^ 1, 3
ASSERT_EQUAL 1 ^ 1 << 1 , 3
ASSERT_EQUAL 1 ^ (1 << 1), 3
; シフト演算子は比較演算子よりも優先順位が低いか?
; ==> 正しくない。シフト演算子は比較演算子よりも優先順位が高い。
ASSERT_EQUAL 1 << 1 == 1, 0
ASSERT_EQUAL (1 << 1) == 1, 0
ASSERT_EQUAL 1 == 1 << 1 , 0
ASSERT_EQUAL 1 == (1 << 1), 0
; シフト演算子は加算・減算演算子よりも優先順位が高いか?
; ==> 正しくない。シフト演算子は加算・減算演算子よりも優先順位が低い。
ASSERT_EQUAL 1 << 1 + 1 , 4
ASSERT_EQUAL 1 << (1 + 1), 4
ASSERT_EQUAL 1 + 1 << 1, 4
ASSERT_EQUAL (1 + 1) << 1, 4
ASSERT_EQUAL 2 << 1 - 1 , 2
ASSERT_EQUAL 2 << (1 - 1), 2
ASSERT_EQUAL 1 - 1 << 1, 0
ASSERT_EQUAL (1 - 1) << 1, 0
if ASSERT_FAILED {
mes "Assertion Failed."
} else {
mes "No error."
}
; 式と期待値が一致するか比較するマクロ
; 一致しない場合、式、期待値、実際の値を表示する
;
; 引数
; %1 式
; %2 期待値
;
#define global ASSERT_EQUAL(%1,%2) \
if (%1) != (%2) { \
mes "%1 ;==> expect: %2, actual: " + (%1) : \
__assert_last_error = 1 \
}
#define global ASSERT_FAILED (__assert_last_error)
; 乗算、除算、剰余の演算子の優先順位は同じで左結合か?
; ==> 正しい
ASSERT_EQUAL 3 * 1 \ 3 , 0
ASSERT_EQUAL (3 * 1) \ 3 , 0 ; 左結合
ASSERT_EQUAL 3 * (1 \ 3), 3
ASSERT_EQUAL 1 \ 2 * 2 , 2
ASSERT_EQUAL (1 \ 2) * 2 , 2 ; 左結合
ASSERT_EQUAL 1 \ (2 * 2), 1
ASSERT_EQUAL 6 / 3 \ 2 , 0
ASSERT_EQUAL (6 / 3) \ 2 , 0 ; 左結合
ASSERT_EQUAL 6 / (3 \ 2), 6
ASSERT_EQUAL 5 \ 4 / 2 , 0
ASSERT_EQUAL (5 \ 4) / 2 , 0 ; 左結合
ASSERT_EQUAL 5 \ (4 / 2), 1
; 剰余演算子は可算・減算演算子よりも優先順位が高いか?
; ==> 正しい
ASSERT_EQUAL 3 + 2 \ 3 , 5
ASSERT_EQUAL (3 + 2) \ 3 , 2
ASSERT_EQUAL 3 + (2 \ 3), 5 ; 剰余優先
ASSERT_EQUAL 5 - 2 \ 3 , 3
ASSERT_EQUAL (5 - 2) \ 3 , 0
ASSERT_EQUAL 5 - (2 \ 3), 3 ; 剰余優先
if ASSERT_FAILED {
mes "Assertion Failed."
} else {
mes "No error."
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment