[Autohotkey入門]你要往盒子裡面裝"點啥"么: 變數- 雪花台湾
文章推薦指數: 80 %
摘要每一個變數都是特別的盒子變數的命名與AHK變數命名淺析表達式: 值、運算符Autohotkey中的數據類型變數參與表達式運算符優先順序( . )
[Autohotkey入門]你要往盒子裡面裝"點啥"么:變數
雪花台灣
2019-03-2622:06
摘要
每一個變數都是特別的盒子
變數的命名與AHK變數命名淺析
表達式:值、運算符
Autohotkey中的數據類型
變數參與表達式
運算符優先順序
(.)英文句號:拼接運算符
變數賦空與未賦值的變數參與表達式
單行代碼多個賦值語句
布爾值Boolean與抽象的邏輯概念
針對布爾值的運算符
(=)賦值與格式轉義符號(%)
AHK的內置變數概述
本章結語
1.每一個變數都是特別的盒子
你所定義的每一個變數代表著程序運行周期內在內存中佔據一個特定的地址編號,它存放著你期望的數值(常量),這裡我們把它比喻成一個盒子。
盒太郎:="點啥"
說起變數,就不得不提及Coder們對待變數的基本動作,賦值。
你可以想像程序運行時,計算機看到你這句話,拿到標籤:盒太郎,興沖沖地在足夠擺放數億個盒子的內存倉庫里,找到一個無主的帶唯一地址序號的空盒子,貼上這個標籤,並在裡面放上了字元串"點啥",以備你不時之需。
當你在編輯器敲下那行AHK代碼,實際是給計算機吩咐了3個確定行為:
你讓計算機給你準備好一個盒子,並貼上你取的名字:盒太郎
你還要給這個盒子[盒太郎]裝上點東西,:=表示這個動作
你確定這個要裝的東西叫是1個字元串:"點啥"
然後我們講正經的。
變數名:=數值
這樣的命令可以看作一個行為指示:把變數(...)放進一段數據(...)
2.變數的命名與AHK變數命名淺析
變數名在不同語言中有相似的命名標準,一般情況下它允許的組成部分有3項:
(a-zA-Z)>>>26個大小寫英文字元
(_)>>>1個下劃線符號
(0-9)>>>10個數字元號
多數編程語言中變數名首位符號只支持1、2兩項,即下劃線與英文字母。
雙下劃線開頭在很多情況下作為編程語言預留的變數或函數的命名規則,如AHK類創建中__New()方法,實際命名中則盡量避免這樣的衝突。
變數的命名,能保證見名知義,精簡,以及風格統一性(可讀性)是極好的。
無論是駝峰命名或是以下劃線做單詞分隔,都是在某種程度上為可讀性的人為建議標準。
AHK在變數名規範上的設定可謂寬容(隨便),此處筆者建議諸位在AHK的變數命名方法上隨大流。
可讀性對於計算機是無關痛癢的細節,為了你下次(第二天/多年後)不用像對待天書一樣揣測這個人(那時的你)的隨性瀟洒的造詞用意。
以下說明AHK變數命名的特色,為了避免變數名稱在編碼解碼與維護代碼存在的深坑,勿濫用ahk的靈活設定作為日常代碼編輯的習慣。
除下劃線,AHK允許#[email protected]這樣的符號置於變數名。
大部分編程語言變數名稱中的英文字母大小寫敏感,即定義時變數box與bOx是兩個不同的變數。
而AHK就變數名稱識別而言並無大小寫的分別,如:yooo
Yooo
YOoo
YOOo
YOOO
這些變數名稱皆指向同一變數,省去了長變數名稱難以糾查拼寫錯誤的麻煩。
AHK甚至允許數字開頭的變數名稱,如:2333hahaha:="我真是個樂觀向上的好青年"
AHK變數名還包括utf-8標準定義的字元,如中文盒太郎在AHK中是個合法的變數名,這個可愛之處,在一定程度上照顧了我等英語廢的命名痛點。
由於沒有中文標點的語法糾錯機制,這也是包容性造就的操蛋之處。
如:,:="我不是個普通的逗號"
。
:="而我也不是個單純的句號"
「」:="嚶嚶嚶,我是不是放錯地方了?"
3.表達式:值、運算符
值是數據運算符是處理兩個數據的方法表達式由值與運算符組成
表達式的最終目標是得到一個值。
1+2
這是一個表達式,這個表達式的構成為:
數值:1和2算數運算符:+加號它將得到一個最終結果值:3若在代碼中有一個單獨的行作表達式毫無意義,將提示錯誤。
所以我們可以把它放到變數中theBox:=1+2
賦值符號亦屬於運算符,它獨為定義變數而存在,一般表現形式為:變數名:=(值)或(表達式的結果=值)
左側為變數名稱右側為數值或表達式這是賦值運算符的基本特徵變數可以作為數值的臨時代號,在程序運行過程中不斷賦值更新內容,變數的內容是根據程序運行動態變化的,故稱作變數。
4.Autohotkey中的數據類型
說道這數據類型,有別於c語言這樣的底層語言對內存倉庫寸土寸金的嚴謹規劃產生的花樣繁多的數據類型,AHK中最基礎的數據類型,可以簡單概括為兩類:字元串型數型
即使可以如此分別,但是兩者之間界限是異常模糊的,其主要表現為:數型數據可以作為字元串執行字元的處理方法,如拼接等。
字元串型單純由數型字元組成時,可以直接參与算數表達式,要注意的是,賦值數型005等同於5,而賦值字元串"005"參與計算返回結果將不如人意。
非數型字元串參與數型算數表達式都將返回空值。
如:theBox:=("一個被算計的字元串"+1)
等同於:theBox:=""
5.變數參與表達式
由於變數命名規則屬於字元串的構成,與數型如123又完全有別。
所以字元串在表達式中以""雙引號括起,而變數在表達式中就光溜溜地直接把名字放上,數字如123也無需""符號就能證明自己的身份。
如下:
theBox:=2
theBox:=50*theBox
第1行代碼只執行了1次計算:2被裝入了變數theBox。
第2行代碼執行了2次計算:50乘以theBox里裝著的2,得到數值100
由賦值運算符把值又扔還給theBox。
6.運算符優先順序
此處優先順序是定義表達式中計算的順序。
接上一段的示例說明。
賦值運算符是一個最低優先順序的運算符,*乘法運算符優先順序高於:=賦值運算符,所以它先一步對數值進行計算,就有了第2行代碼的執行流程。
四則運算加減乘除優先順序與小學教育所教授的相同,乘除優先於加減。
*為乘法運算符,/為除法。
我們可以用()括弧決定運算順序,讓你可以在陌生的算數運算符中不至於在優先順序上做太多糾纏。
括弧內可以是表達式如:(1*(3+2))
或單獨的數值如(88)
(變數名)
("字元串來一個")
我們閱讀代碼時,面對一個較長的表達式。
可以從()括弧內部看起。
接著尋找最高優先順序的運算符,根據運算符特性求值。
表達式根據運算符優先順序依序計算數值,如此順序往複,直到取得最終值。
相同優先順序的運算符則從左至右逐對運算,而賦值運算符比較特別,它從右至左開始運算。
如:a:=3+b:=3+c:=3
得到a(9)b(6)c(3),在實際編碼賦值語句編寫時不建議如此瞎眼的寫法,請按部就班以可讀性為修養操守。
計算機以單一而高頻的方式處理數據,並將結果保存在內存中,直至下一條指令到來,這是計算機最基本的工作內容。
7.(.)英文句號:拼接運算符
AHK有一個為字元串準備的.(英文句號)運算符,它負責以字元串形式拼接兩個數據,它的優先順序低於普通的算數運算符。
如下:aStr:="喂呀"
theBox:=5*6.666."哎喲".aStr
最終結果得到theBox值為:"30666哎喲喂呀"在表達式中若只以空格分隔數據,如同.運算符一般將直接被拼接,如:aStr:="喂呀"
theBox:=5*6666"哎喲"aStr
與上個示例結果一致。
在運用拼接時,建議把各拼接項目以()括起,沒什麼特別,可讀性嘛。
aStr:="喂呀"
theBox:=(5*6).(666).("哎喲").(aStr)
同樣是結果一致。
在拼接項目過多時,可以分行進行字元串元素的拼接,如:theBox:=5*6
.666
."哎喲"
.aStr
結果一致。
其中首位拼接元素必須置於:=賦值符號之後,由第2行開始以(.)拼接符號起頭。
8.變數賦空與未經賦值定義的變數參與表達式
theBox:=
theBox:=""
這是兩個等效的賦空語句,多用於釋放內存,或代替布爾假值。
空值在AHK中有時是個攪屎棍,它在任意長度算數表達式中,將置空整個表達式的值。
empBox:=
theBox:=empBox+1*2
如上,首行變數empBox被賦空,次行變數theBox緊跟的表達式將被盡數置空,像是順豐給你送了兩個空盒子。
借用知乎專欄【Autohotkey之美】中前輩一句對AHK變數定義:使用即存在。
theBox:=empBox+1*2
未定義的變數在表達式中使用不會報錯,少了empBox賦空流程,該行代碼仍然等價於上個示例,同樣在內存中申請了兩個存放空值地址,意味著你在難以察覺的拼寫錯誤時可能要耗費一些時間排查,這是靈活的代價。
9.單行代碼多個賦值語句
a:=1,b:=2,c:=3
多個賦值語句以,逗號分割,幫助文檔描述這樣的賦值辦法有提升性能的奇效,但要留心的是a:=1,b:=,c:=3
若其中一項變數以(變數名:=)方式寫下,將導致同行其餘變數盡數被賦空。
而(變數名:=""),賦值為空字元串就沒有這樣的擔憂。
如:a:=1,b:="",c:=3
這行賦值語句的結果是變數b被賦空,a、c兩個變數分別成功被賦值為1、3。
10.布爾值Boolean與抽象的邏輯概念
布爾值,即真/假值,在編程語言中多以兩個變數代替,true/false,它倆對應的數值分別為1/0。
true:=1
false:=0
在實際編碼中,true/false是不允許被賦值的。
0與1是真假值兩個經典的數值範例,實際是,每一個值,每一個表達式的結果值都具備布爾性質。
它主要用於流程執行的邏輯判斷,這裡要提到一個流程式控制制語法if,一種非黑即白的執行策略,本章僅作簡單示例。
一般概念
if(表達式>值>布爾性質>判斷條件)
{
代碼塊...
}
示例代碼:
我餓了:=true
if(我餓了)
{
我吃飯()
}
將它用作人類語言,可以描述為:若我餓了是真的,會發生我吃飯這件事
在程序語法的流程順序是:
變數我餓了所保存的值為真值
if確認該表達式值為真,才執行{}內代碼塊。
執行{}中間唯一的一個功能函數我吃飯()。
變數我餓了保存的數值true(1)是為了判定流程執行邏輯,換以我很英俊:=true沒差,計算機不會賤兮兮吐槽報以噓聲,只不過有悖於變數見名知意的準則,這也是我們日常編碼要處理的尷尬矛盾。
if後接表達式允許使用賦值:=符號,如:if(我餓了:=true)
等效於if(true)
等效於if(1)
布爾屬性假值有二,空值與0其餘具為真值
真值:列2個if緊接真值的判斷:if("我肯定我是真的")
if(3+2)
包括單獨的空格字元也屬於真值,如:imTrue:=""
if(imTrue)
假值:再上2個假值先前提到,被賦空的變數,表達式中使用的未定義的變數,皆為空值,空值在布爾性質為假值,如:empBox:=""
if(empBox)
{
;...這裡的代碼將永遠被遺忘
}
等價於if(未賦值的變數)
{
;...所以我這個代碼塊存在的意義呢
}
11.針對布爾值的運算符
這類用途的運算符也是五花八門的雜,根據運算特徵區別,就共性來說,這些運算符不論以怎樣的邏輯處理數據,僅返回0或1其中一個值。
以下做4組示例。
1.(!)取反符號,邏輯非,真值轉為假值,假值轉為真值。
真轉假:將布爾真值計算為假(0),如下:!(5)
!("有字的哦")
假轉真:將布爾假值計算為真(1),如下:!(未賦值的變數)
!("")
!(0)
以上括弧可省,僅為閱讀便利用途,(!)取反符常用於開關邏輯。
(!)作用於右側的單項值,它優先順序在普通算數運算符之上(也在所有邏輯/比較運算符之上),not運算符是同樣作用,要留心not優先順序在算數運算符之下。
如:!1+1;得1
not1+1;得0
是優先順序次序導致的計算順序差異,如下順序:(!1)+1
not(1+1)
故(!)取反符號作用於長表達式時,用()可以解決這類麻煩。
!(1+1)
可以試著理解下面示例表達式/賦值語句,它初次被激發,變數(開關)是何值,再次激發是何值?開關:=!開關
2.(&&)邏輯與、(||)邏輯或
(&&)優先順序高於(||),這兩個運算符根據左右兩端布爾屬性判斷取值。
(&&)表示該運算符2邊都是真值為真(返回1),有1項為假值則返回假(0),同運算符and,建議固定選用其中一種。
(555)&&("嚶嚶嚶");返回1
(0)&&(666);返回0
(||)兩個分隔符表示兩端有一項是真值即真(1),兩端都為假返回0,同運算符or。
("不怕豬隊友")||(0);返回1
(0)||("");返回0
(&&)或(||)連用性質與單獨使用相仿,不做贅述。
...&&...&&...&&...
...||...||...||...
3.>、(!=)、之流比較運算符
從(==)說起,它嚴格匹配左右兩端每一位字元,區別大小寫。
(=)符號作用類似(==),只不過(=)就字元串匹配忽略大小寫差異。
("a")=("A");返回1
("a")==("A");返回0
在純數間判斷差異不大(005)=(5);返回1
(005)==(5);返回1
(2.100)=(2.1);返回1
(2.100)==(2.1);返回1
但是字元串與數型混用比較可能造成麻煩("005")=(5);返回0
("005")==(5);返回0
("2.10")=(2.1);返回0
("2.10")==(2.1);返回0
是(0)的鍋。
("5")=(5);返回1
("5")==(5);返回1
("2.1")=(2.1);返回1
("2.1")==(2.1);返回1
(<>)與(!=)是同樣的用途,包括優先順序相等,意思是不等於,即符號兩邊值不相等時返回1。
但是對字元串的比較沒那麼苛刻,將忽略大小寫。
若需要嚴格區分大小寫可以參考!("abc"=="Abc")返回1,如:("Abc"!="abc").("Abc"<>"abc").(!("Abc"=="abc"))
此行表達式返回001,代表這三段表達式的運行結果。
(>)大於號、(5>2
這個表達式在我們一般觀念中似乎沒有什麼錯誤。
但實際它在AHK的運算流程是:(10>5)>2
(1)>2
(0)
布爾相關的運算符計算結果為數型,參與算數表達式無礙,卻容易在概念上混淆,無論是邏輯表達式,比較表達式,還是算數與真假值計算的運算符混用的表達式,日常編碼中儘可能以()區別開來,如:(10>x)&&(x>2)
這個表達式判斷變數x是否在2至10這個區間的數值。
上面說到這類運算符常見於if判斷,我們仍然可以將布爾性質的表達式賦值於變數中。
由於字元串與數型數值界限曖昧,為避免兩者交集的深坑,非必要情況請區別使用。
12.(=)賦值與格式轉義符號(%)
(%)這個符號在AHK很重要,但是(=)賦值難以描述。
簡單來說,(=)賦值是為了字元串而生的,它的眼中沒有表達式,它所賦值內容,作用規則與命令式的參數編輯辦法完全相同。
為解決字元串中變數引用的問題,有了(%)這個磨人的小妖精,這也是AHK新手糾結的主要難點。
例如:theBox=(5=5)
上例theBox得到"(5=5)"這個字元串。
theBox:=(5=5)
上例theBox得到布爾值結果(1),(:=)賦值符號之後,此處(=)作為比較運算符食用。
theBox=%(5=5)
上例theBox同樣得到(1)這裡說明一下(%)符號其中一個用法,當放置於(=)賦值符號後首位,其後參數性質將等同於(:=)賦值符號的應用規則。
theBox:=%表達式
(:=)賦值這種寫法無礙,就是多此一舉。
它近似於(:=)符號後跟的所有編輯的代碼都跟著("")雙引號,但是(%)符號是原意,故無法在("")雙引號字元串中使用(%)符號對格式轉義或變數取值。
(=)賦值的作用範圍僅限於:變數名=...
上例這樣的單行格式開頭,其餘情況下(如if後接的表達式),(=)符號皆視作比較運算符。
它在多行段字元串變數賦值有不錯的表現。
格式如下。
theBox=
(
行1字元串
行2字元串
)
這在(:=)多行賦值得是另外的寫法如下:theBox:="行1字元串"
."`n行2字元串"
順帶一提,("`n")是(`)轉義符對字母(n)的轉義,類似c語言中(
),表示換行符,單行代碼欲賦值多行字元串時,兩個賦值符的寫法分別為:theBox:="行1字元串`n行2字元串"
theBox=行1字元串`n行2字元串
(=)賦值符後,(%)與(`)符要輸出原意字元,則使用(`%)和(``)。
上面說到單個(%)要置於=符號後首位,將其後數值以更嚴謹的方式解碼代碼,不在首位的單個(%)符號會讓腳本報錯,如:a=搗蛋鬼%"來了"
最後來一個,雙百分號變數取值:%變數名%它在(=)與(:=)兩個賦值符號中表現差異明顯。
先上(=)號:theBox1:=666
theBox2:="寶物耶!"
lookLook=讓洒家探探兩盒間奧妙:(%theBox1%),(%theBox2%)
得到lookLook的結果是字元串:"讓洒家探探兩盒間奧妙:(666),(寶物耶!)"(%變數名%)在兩個百分號間的變數名不允許空字元的存在如:(%變數名%),它僅僅本分地把盒子里的字元串交出來,不做它用。
在(:=)或(=%)之後,%變數名%又是一個百變天后的奇葩模樣。
具體表現如下:theBox:="heart"
heart:=2333
粉絲頻道=%theBox%
八卦頻道:=%theBox%;(等效於:八卦頻道=%%theBox%)
如上,百變天后變數theBox被賦予了"heart",在變數粉絲頻道=中,theBox有一個單純的"heart"(字元串),但是萬惡的變數八卦頻道:=指出theBox的"heart"別有洞天,她的heart中有2333這樣的傲慢情節。
這是一個跨越的指向。
是theBox的值在(八卦頻道:=)後被視作變數名,後而解析變數名為變數名的值。
但要注意的是:八卦頻道:=%heart%
heart返回的2333純數無法作為變數名取值,八卦頻道(:=賦值結果)將被置空。
如果你接觸過c語言,會有一種指針的指針的既視感。
13.AHK的內置變數概述
AHK中有豐富的內置變數,內置變數的名稱多以A_作為前綴,如循環語句中的A_Index,腳本當前完整路徑A_ScriptDir等。
除了編碼世界中比較普遍的true/false,它包含AHK中重要功能項的一些關鍵參數,幫助文檔說明其並非盡數是實時更新的,我們關注引用時的參數內容即可,於本章節不做贅述。
內置大多不可進行賦值操作,且皆屬於全局變數的範疇,可以在函數中引用。
有一特例ErrorLevel,它可以進行賦值,在個別命令式中無返回值,用於邏輯判斷。
命令式是AutohotkeyL版本的特色,將在後續章節進行說明。
14.本章結語
祥見Autohotkey幫助文檔【基本用法與語法-變數和表達式】,這裡有最完全的以優先順序排序的運算符列表及內置變數功能劃分說明。
關於變數的說明比較抽象,但是我希望這章節能解決新手某些流於語法與基本概念的困擾,關於:=與=賦值符號後面數據參數的區別,在AHK語法規則中佔有想當厚重的分量。
在這一章也為了內容枯燥可能產生的疲勞情緒,賣萌賣得心力交瘁=.=。
後續將陸續推出針對實例應用的教程,歡迎閱讀。
推薦閱讀:
相关文章
为你推荐
UI設計師入門有沒有好的教程?
1年前
想從事UI設計行業,不知道該不該去買網上教程?
1年前
母親節禮物想做手工,求推薦或手工教程?
1年前
有沒有比較全的手工編織教程?
1年前
個人感覺學習編程就是多練多想,比任何教程都有用,同意么?
1年前
誰能推薦一個簡單的C4D軟體入門教程?
1年前
如何使用photoshop,有關於自學photoshop的教程分享嗎?
1年前
有沒有ps自學教程選擇指南推薦?
1年前
想學習視頻剪輯,從哪裡可以找一些教程?
1年前
請問學習視頻軟體pr和ae哪個教程比較好可以花費時間學習?
1年前
為什麼「21天搞定XX」成為了很多教程類圖書的書名模版?
1年前
自學ps用什麼軟體比較好,有哪些值得參考的書籍或教程?
1年前
求問各位審美好的設計大神?哪裡有學設計相關的軟體PSAI等軟體的資源教程等一定要美的教程?
2年前
大學想提前自學一些課程,但是光看書又不夠,網上又沒有學校配套教材的教程視頻,想問怎麼處理這個問題呢?
2年前
想基於matlab學習機器學習、深度學習的知識,有什麼推薦的教程和視頻嗎?
3年前
热门新闻
周热门
Copyright©2017雪花新闻Powered
by xuehua
延伸文章資訊
- 1[AHK-] AutoHotKey 入門教學- 變數與剪貼簿 - PTT Web
[AHK-]AutoHotKey入門教學-變數與剪貼簿@ezhotkey,共有8則留言,3人參與討論,1推0噓7→, 變數與剪貼簿: Using variables and the clipbo...
- 2基礎AHK 中符號的用法 - 程式網
當用= 對變數賦值時,如果一個字串被兩個% 包圍,並且中間沒有空格,那麼含義是取這個變數的值。 在呼叫一個命令時, ...
- 3[AHK-] AutoHotKey 入門教學- 變數與剪貼簿- 看板EzHotKey
變數與剪貼簿: Using variables and the clipboard http://www.autohotkey.com/docs/Tutorial.htm#Variables 變...
- 4AutoHotkey腳本的4種除錯方法(AHK #5) - 簡睿隨筆
除錯方法2: 用ListVars與Pause. ListVars讓AutoHotkey視窗顯示全局變數供我們檢視。 #c:: WinGetClass, sClass, A ;//取出目前視窗的類...
- 5Autohotkey:依序產生變數,以及依序取出變數 - KSL`s Base
Autohotkey:依序產生變數,以及依序取出變數. 可以透過:=左邊也是變數的方式來組合變數,例如透過loop的方式,把行列的值拿來拼成變數,像是%1_1% ...