変数と式

変数 (Variables)

変数の型 (Variable types)

AutoHotKeyには変数の型はなく、すべて文字列として保持されます。しかし変数が数字 (小数点を含む) だけの場合には、数式や比較処理のときに数値と解釈されます。

a := 2
b := "3"

c := a * b
MsgBox, % c ; 6

文字列

エスケープ文字は既定でバッククォート (`) となっており、バックスラッシュ (\) ではありません。

整数と浮動小数点数

小数点を持つ場合は浮動小数点数として扱われ、それ以外は整数となります。式ではいずれかの値が浮動小数点数ならば、結果は浮動小数点数となります。

a := 3 / 2
MsgBox, % a ; 1.500000
16進数

「0x」の接頭辞を付けることで16進数と認識されます。

a := 0xA

b := a
c := a + 0

MsgBox, %b%  ; 0xA と表示
MsgBox, %c%  ; 10 と表示

論理型

型としての論理型はありませんが、「true」「false」の2つが組み込み変数として用意されています。

a := true
MsgBox, %a% ; 1 と表示

a := !a
MsgBox, %a% ; 0 と表示

変数の名前 (Variable names)

変数の名前では、大文字と小文字は区別されません

変数のスコープ (Variable scope)

関数外で定義された変数は、グローバルなスコープを持ちます。Local and Global Variables

関数内からグローバル変数を参照するには、先にそれへの参照をglobalキーワードで宣言します。これを怠ると、関数内でのローカル変数が新たに定義されることになります。

a := "A" ; グローバル変数

Func()
{
    global a ; グローバル変数を参照するための宣言

    b := "B" ; ローカル変数
}

変数定義のタイミング

変数は、それを定義する処理が実行された時点で定義されます。

Exit
X := "ABC"

^a:: msgbox, %X%
^b:: X := "OK"

最初に^aのスクリプトを呼び出しても、何も表示されません。次に^bを呼び出してから再度^aを呼び出すと、"OK"と表示されます。

変数への値の代入

スクリプト パラメータ以外には、コロン イコール ( := ) を使用します。この演算子は式の評価結果を代入します。

MyNumber := 123
MyString := "ABC"  ; 文字列はダブルクォーテーション ( " ) で囲む
CopyOfVar := Var   ; 変数はパーセント ( % ) で囲まない
Var := expression

関数の戻り値以外ではイコール ( = ) でも代入を行えますが、その使用には注意が必要です。「:=」と同様の結果を得るには、

MyNumber = 123
MyString = ABC    ; 文字列はダブルクォーテーション ( " ) で囲まない
CopyOfVar = %Var% ; 変数はパーセント ( % ) で囲む
SetEnv

のようにする必要があります。これをまとめると、

(:=) と (=) の比較
  := =
数値 123
文字列 "ABC" ABC
変数 Var %Var%

のようになります。

関数の戻り値の代入

関数の戻り値には、必ず「:=」を使用します。「=」を使用すると、式ではなくただの文字列として評価されてしまいます。たとえば、

length = StrLen( "abc" )

のようにすると、変数lengthには「StrLen( "abc" )」が代入されます。

スクリプト パラメータの代入

スクリプト パラメータで渡された値には、必ず「=」を使用します。通常の変数と同様に、

x := 1

とすると、数値の「1」が代入されてしまいます。よって「=」の構文で、

x = %1%

とする必要があります。

ダブルクォーテーションの代入

「:=」を使用するとダブルクォーテーションは文字列を示す記号と認識され、エラーとなります。

a := "A ; Error: Missing close-quote

よって必ず「=」を用います。

b  = "A

配列 (Arrays)

Array := [Item1, Item2, ..., ItemN]
Array := Array(Item1, Item2, ..., ItemN)
Simple Arrays - Objects
array := [10,20,30]

value := array[2]  ; 20が格納される
MsgBox, % array[2] ; 20と出力される
指定位置に挿入
array := [10,20,30]
array.InsertAt(2,"A","B") ; 10,"A","B",20,30
末尾に追加
array := [10,20,30]
array.Push("A","B") ; 10,20,30,"A","B"
末尾から削除し、取得
array := [10,20,30]

RemovedValue := array.Pop()
; arrayは、10,20
; RemovedValueは、30
指定位置から削除し、取得
array := [10,20,30]

RemovedValue := array.RemoveAt(2)
; arrayは、10,30
; RemovedValueは、20
反復処理
array := [10,20,30]

Loop, % array.Length()
    MsgBox, % array[A_Index] ; 10,20,30とくり返し出力

For index, value in array
    MsgBox, % index "-" value ; 1-10,2-10,3-30とくり返し出力

2次元配列

array := [[10,20,30],[40,50,60]]

MsgBox, % array[2,1] ; 40と出力

連想配列 (Associative Arrays)

Array := {KeyA: ValueA, KeyB: ValueB, ..., KeyZ: ValueZ}
Array := Object("KeyA", ValueA, "KeyB", ValueB, ..., "KeyZ", ValueZ)
Associative Arrays - Objects Associative Arrays - Arrays
array := {"A":10, "B":20}

value := array["A"]  ; 10が格納される
MsgBox, % array["A"] ; 10と出力される

疑似配列 (Pseudo-Arrays)

AutoHotkey_L以前は配列をサポートしないため、変数名を変数で表すという特殊な手段により実現します。

X := p%index%

このときindexの値が"1"だとすると、この式は

X := p1

となり、変数p1の内容が参照されます。多次元も同様に、

X := p%index1%_%index2%

のように複数の変数を使用します。Pseudo-Arrays - Arrays

式 (Expressions)

式では変数はパーセントで囲みません。一方で文字列はダブルクォーテーションで囲みます。これは前述のコロン イコール ( := ) での用法と同じになります。

なお変数を配列として使用する場合には、変数をパーセントで囲みます。

式への変換

v1.1.21以降では定数を要求されるとき、パラメータの最初に「% 」を付加することで式とみなされようになります。このとき「%」だけでは機能せず、それにスペースまたはタブが続く必要があります。Force an expression - Variables and Expressions - Definition & Usage | AutoHotkey

それゆえ次のMsgBoxは、同一内容を表示します。

foo := "AA"
bar := "BB"

MsgBox, % "CC" . foo bar . "DD"
MsgBox, CC%foo%%bar%DD

また式とすることで、演算結果をパラメータとして与えることも可能となります。

a := 2
b := 3

MsgBox, % a + b   ; "5" と表示
MsgBox, %a% + %b% ; "2 + 3"

MsgBox, % 2+3 ; "5" と表示
MsgBox, 2+3   ; "2+3"

演算子 (Operators)

演算子 説明
%Var%  
++
--
 
**  
-
!
~
&
*
 
*
/
//
 
+
-
 
<<
>>
 
&
^
|
 
. 両辺を文字列として連結 (Concatenate) する

(演算子の両側にスペースが必要)

>
<
>=
<=
 
=
==
<>
!=
 
NOT  
AND
&&
 
OR
||
 
?:
条件演算子 (conditional operator)
:=
+=
-=
*=
/=
//=
.=
|=
&=
^=
>>=
<<=
 
,  
mod()
round()
abs()
 
Expression Operators (in descending precedence order) - Variables and Expressions - Definition & Usage | AutoHotkey
a := 2
a += 3
a++

MsgBox, % a ; "6" と表示

比較

x1 :=  2 =  2 ; 1
x2 :=  2 == 2 ; 1
x3 := -2 <  1 ; 1
x4 :=  2 < -1 ; 0

x5 := 2 <  10  ; 1
x6 := 2 < "10" ; 0

a := "10"
x7 := 2 <   a  ; 1
y1 := "A" =  "a" ; 1
y2 := "A" == "a" ; 0
y3 := "A" <  "B" ; 1
y4 := "A" >  "B" ; 0

「=」は大文字/小文字を区別せず、「==」は区別して比較されます。一方で数値と解釈されるときには、この2つは同一です。ただしStringCaseSenseでOnと設定されていないならば、文字列でも同一となります。ところで「<>」「!=」にはこのような違いはなく、つねにStringCaseSenseの設定に依存します。