のら(NORA)のブログ

主にソフトについて備忘録で(手抜き)書いていますねー。困った人の役とかに立てばいいかなー。とかそういう程度の奴でーす。むぎゅぎゅ~。更新停滞中ですね~。

autohotkey2.0勉強中(翻訳)その6~式編~

前→(変数編)

目次

はじめに

その1のコピペ

翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)

一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う

参考:ahkwiki日本版様及び公式ヘルプ

式編

  • 式は、一連の変数、リテラル文字列、および/またはリテラル番号に対して1つまたは複数の操作を実行するために使用される
  • 式内の変数は、パーセント記号で囲まなくていい(引用符付きの文字列内の変数、擬似配列およびその他の二重引用符を除く)
  • したがって、リテラル文字列は変数と区別するために二重引用符で囲む必要がある

    ex: if (CurrentSetting > 100 or FoundColor <> "Blue")

  • 式に空の文字列を指定するには、空の引用符を使用する

    ex: if (CurrentSetting > 100 or FoundColor <> "")

  • 式の結果を変数に代入するには、:= 演算子を使用する

    ex: NetPrice := Price * (1 - Discount/100)

ブーリアン(boolean)型

  • 式が真または偽(IF文など)で評価する必要がある場合、空白またはゼロならは偽とみなされ、他のすべての結果は真とみなされる
  • 変数を空白にするか0を代入するだけで、偽の値を保持することができる
ex: 変数*ItemCount*が空白または0の場合  
if ItemCount  はfalse(偽)の判定(結果)になる
ex: if Done とすると(Doneは変数)変数の値がtrueかfalseか判定できる
  • NOT / > / = / < のような演算子は、真または偽の値を自動的に生成する
    • 真の場合は1、偽の場合は0が生成される
  • ただし、AND/OR演算子は常に入力値の1つを生成する
ex: A_Indexが5より大きい場合は変数Doneに1が、それ以外の場合にはFoundItの値が割り当てられる
Done := A_Index> 5 or FoundIt
  • 式中では、trueとfalseは1と0に解決される
ex: スクリプトをより読みやすくするためにこう書いてもいいっていうか書くなら普通こう書くでしょっていう  
CaseSensitive := false  
ContinueSearch := true

イント(整数)及びフロート(浮動小数点数)(Integers,floating point)型

  • 式中で、小数点や科学的表記法を含む数値は浮動小数点数と見なされる
  • それ以外の場合は整数として見なされる
  • 加算や乗算などのほとんどの演算子では、いずれかの入力が浮動小数点数の場合、結果も浮動小数点数になる
  • 式と非式の両方で、整数は16進数または10進数のいずれかの形式で記述できる
  • 16進数はすべて0xで始まる、例えば、Sleep 0xFFはSleep 255と同じ
  • 浮動小数点数は、オプションで小数点の有無にかかわらず科学的表記法(ex: 1e4または-2.1E-4)で記述することができる
  • 式中では、128、0x7F、1.0などの引用符で囲まれていない数値は、スクリプトが実行を開始する前に純粋な数値(十進数)に変換されるため、数値を文字列に変換すると、元のとは異なる値が生成されることがある
  • 3/2では1.5が得られ、4/2では2ではなく2.0が得られる
  • 1.0、5.0 // -3 は -2.0になる

式の代入/条件分岐

  • 変数の代入・計算・条件分岐とは別に、複雑な式を用いた代入や条件分岐も使用できる
  • また、一部のコマンドにある単独で数値を指定するパラメータでは、式で値を指定することもできる
  • それ以外のパラメータでは、「% a+b」のようにパラメータの最初に「%」と半角スペースをつければ、式を指定できる
  • 式の代入/条件分岐では、他のコマンドとは変数の扱い方などが違っている
ex:
Var1 := 100 
Var2 := Var1+10
  • 式の代入には、「:=」を使う
    • 式中で変数を使うときは、「%」ではさまずに、そのまま記述する
    • 数字列は数値として計算される
    • ahk1で使えた「=」は使えない、「:=」に統一されたそのくせ例はそのままで「=」のままなんだよな混乱する(´・ω・`)
ex:
Var1 := 100  
  Var2 := 10  
  Index := 1  
  VarName := Var2  
  Var3 := Var%Index%+%VarName%  
  a := 1  
  b := 2  
  c := 3  
  xxx1xxx23xxx := 10000    
  Var := xxx%a%xxx%b%%c%xxx
  • 式中に「%」ではさんで変数名を書くと、その内容が展開された上で、変数名として扱われる
  • 前後の変数名として妥当な文字とあわせて変数名として扱われる
  • 変数参照を展開した結果が式などになる場合、不正な変数名としてエラーになる
ex: 
If(Name:="Taro" or Name:="太郎")  
MsgBox,He is Taro.
  • 式による条件分岐は上記のように、Ifに続いて式を括弧で囲んで書く 文字列は、「"」で挟む
  • 空の文字列を表すには、「""」と2つ続けて書けばよい
  • 式中に「"」を含む文字列を使用したい場合、「"」の代わりに「""」と2つ続けて書く
ex: 
SetFormat,FLOAT,0.1  
Var := 0.0 * 0.0  
 MsgBox,%Var%  
Var := 10/3  
 MsgBox,%Var%  
Var := 10/3 * 10/3 * 10/3  
 MsgBox,%Var%
  • 算術演算子のどちらかが小数値だった場合、結果は小数値になる また、演算結果が小数になる場合も、自動的に小数値になる
  • 算術演算の結果が小数の場合、計算途中は浮動小数点値で保持され、最終的にSetFormatコマンドで指定された形式で変数に格納される
  • 「1/0」「x+*y」などのように、正常に処理できない演算は、空の文字列として扱われる

その他の条件分岐

  • If / IfEqual / IfNotequal / IfLess / IfLessOrEqual / IfGreater / IfGreaterOrEqual 変数の比較(「:=」「<>」「>」「<」「>=」「<=」と同じ)
  • IfExist / IfNotexist ファイルの存在の有無
  • IfInString / IfNotInString 文字列中に指定の文字列が含まれるかどうか
  • If var [not] in values / If var [not] contains values varの内容がvaluesに列挙した文字列と一致するかどうか
  • If var is [not] type 変数のデータ形式
  • IfMsgBox 一番最近のMsgBoxコマンドで押されたボタン
  • IfWinActive / IfWinNotActive 指定したウィンドウがアクティブかどうか
  • IfWinExist / IfWinNotexist 指定したウィンドウが存在するかどうか

各種演算子

文字列演算子

  • Exp1 . Exp2 2つの変数や文字列、式の結果を文字列として連結する
  • Exp1と「.」、「.」とExp2の間にはスペースを空けなければいけない

算術演算子

  • A: 「-」をつけられた項や式は負の値を表す
  • A+B: 加算
  • A-B: 除算
  • A*B: 乗算
  • A/B: 除算
  • A//B: 割り切らない除算
    • たとえば、「7//3」 は 2に、「7//-3」 は -2になる
    • いずれかの被演算子が小数表現だった場合、小数として除算した商を超えない最大の整数に丸められる
    • また、この場合結果は小数表現になる(「7//3.0」 は 2.0、「7//-3.0」 は -3.0になる)
  • A**B: 累乗、AのB乗
  • AとBは共に小数値が使用できる

ビット演算子

  • ビット演算を使用できるのは整数値のみ
  • 小数値は、整数値に変換してから計算される
  • つまり誤差が出る
  • 内部的には64ビット符号付整数で扱われている模様
  • 符号付64ビット整数の範囲(-9223372036854775808..9223372036854775807)の範囲に収まらない場合、65ビット目より上は切り捨てられる
  • ~A: Aのビットを反転する
    • 32ビット符号なし整数の範囲内の値は、下位32ビットだけ反転される
    • (負の値の場合、32ビットでも64ビットでも結果は同じ)
  • A|B: ビットの論理和
  • A&B: ビットの論理積
  • AB: ビットの排他的論理和
  • A>>B: Aを右にBビットだけシフトする
    • 論理右シフトなので、最上位ビットが1でも、開いた左側には常に0が詰められる
    • 算術右シフトをしたいときは、2**Bで割る
  • A<<B Aを左にBビットだけシフトする

論理演算子

  • 数値のゼロや空の文字列は偽(False)として扱われ、それ以外は真(True)として扱われる
  • 論理演算の結果を変数に代入すると、偽(False)の場合「0」、真(True)の場合「1」が代入される
  • ! A(NOT A) 真偽を反転する
    • !のほうが演算子の優先度が高い
  • A || B(A OR B) 論理和
  • A && B(A AND B) 論理積

比較演算子

  • 主に条件分岐で使用するが、比較演算の結果を変数に代入する場合、偽(False)なら「0」、真(True)なら「1」が代入される
  • 数値でないものを比較する場合、文字列として文字コードの並び順で比較される
  • 数値であっても、「"」で囲まれている場合は、文字列とみなされる(ex: 「"10"」)
    • このとき、StringCaseSenseコマンドで設定が変更されない限り、大文字小文字の違いは無視される(「=」「==」を除く)
  • 文字列の演算における大文字小文字の違いは常に無視される

  • A > B: AがBより大きいなら真(True)になる

  • A < B: AがBより小さいなら真(True)になる
  • A >= B: AがB以上なら真(True)になる
  • A <= B: AがB以下なら真(True)になる
  • A = B: AとBが同値のとき真(True)になる
  • A == B: AとBが同値のとき真(True)になる
  • A != B(A <> B): AとBが同値でないとき真(True)になる

アドレス演算子

  • &Var 変数Varの格納されたメモリ領域のアドレスになる
  • *Addr アドレスが整数Addrで表されるメモリ領域のバイト値(0...255)になる
  • 「*Addr := Asc("x")」のように代入先にはできない
  • 値を変更するには、「DllCall("RtlFillMemory", UInt, Addr, UInt, 1 , UChar, Asc("x"))」のようにする

次→(繰り返しと分岐編)