2.5容器-变量

这一部分知识是至关重要的,可以说不理解这部分就没入门编程。为什么这个说呢,某种意义上说编程就是程序结构和程序数据的排列组合,对于AutoHotkey编程语言来说程序结构就是语法,程序数据就是词汇量。经过一段时间的接触,一般语法就能掌握,后面遇到困难主要是对词汇的理解不到位、词汇应用不当等,所以学习词汇的时候就要学透、学深,学透、学深的基准就是对数据操作的精准理解,变量、数组、类,就是为操作数据而生的概念,我统称它们为容器,对于AutoHotkey编程语言来说就是要把容器部分研究明白了,数据操作就研究明白了,后面可以避免绝大部分问题。

一、变量是什么

顾名思义,变量就是可以变化的量。变量是程序的基本组成单位,变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,从而通过变量名可以访问到变量(值),换句话说变量名用来用来查找对应的内存,它对应的就是内存地址

变量应该有名字,并在内存中占据一定的存储单元;变量名和变量值有不同的含义;变量名实为一个符号地址。

2.5容器-变量

二、变量命名规则

首先说明一点,autohotkey语言变量命名规则很宽松,变量可以在脚本的任意位置读取或修改它们的内容. 除了在函数页面注明的情况,变量都是不需要声明的;使用它们的时候它们就产生了(每个变量初始为空)。用起来非常方便,但是看起来也会显得比较混乱,下边简单谈一下变量的命名:

  1. 不能与表达式运算符冲突,因为单词 AND , OR 和 NOT 作为表达式的运算符使用, 所以通常不应该把它们用作变量名称. 在表达式中使用这样的名称会无法正确计算.
  2. 不能与函数名冲突,跟函数名冲突后,会给阅读者造成很大困扰,同时也会引发一些运行错误。
  3. 不能与内置变量冲突,冲突后系统会当作内置变量处理。
  4. 不能与环境变量冲突。

几点提示:

  1. 变量名不区分大小写 (例如, CurrentDate 等同于 currentdate ). 变量名可以含有多达 253 个字符, 并且可以由字母, 数字以及后面的标点组成: # _ @ $
  2. 考虑到命名的惯例, 通常在命名变量时最好仅使用字母, 数字和下划线 (例如: CursorPosition , Total_Items 和 entry_is_valid ). 这样的风格可以让熟悉其他计算机语言的人更容易理解您的脚本. 而且, 如果您在 AutoHotkey 和其他语言中使用相同的风格, 您会发现能更容易重新读懂自己的脚本.
  3. 尽管变量名可以完全由数字组成, 但通常这样的名称仅用于 传入的命令行参数 . 这样数值名称的变量不能用在 表达式 中, 因为它们会被看成是数字而不是变量.

变量名在不同语言中有相似的命名标准, 一般情况下它允许的组成部分有3项:

  1. ( a-z A-Z) >>> 26个大小写英文字符
  2. ( _ ) >>> 1个下划线符号
  3. ( 0-9 ) >>>10个数字符号

多数编程语言中变量名首位符号只支持1、2两项,即下划线与英文字母。

双下划线开头在很多情况下作为编程语言预留的变量或函数的命名规则,如AHK类创建中__New()方法,实际命名中则尽量避免这样的冲突。

变量的命名,能保证见名知义精简,以及风格统一性(可读性)是极好的。

无论是驼峰命名或是以下划线做单词分隔,都是在某种程度上为可读性的人为建议标准。

AHK在变量名规范上的设定可谓宽容(随便),此处笔者建议诸位在AHK的变量命名方法上随大流。可读性对于计算机是无关痛痒的细节,为了你下次(第二天/多年后)不用像对待天书一样揣测这个人(那时的你)的随性潇洒的造词用意。

以下说明AHK变量命名的特色,为了避免变量名称在编码解码与维护代码存在的深坑,勿滥用ahk的灵活设定作为日常代码编辑的习惯。

除下划线,AHK允许#$@这样的符号置于变量名。

大部分编程语言变量名称中的英文字母大小写敏感,即定义时变量box与bOx是两个不同的变量。

而AHK就变量名称识别而言并无大小写的分别,如:

yooo
Yooo
YOoo
YOOo
YOOO

这些变量名称皆指向同一变量,省去了长变量名称难以纠查拼写错误的麻烦。

AHK甚至允许数字开头的变量名称,如:

2333hahaha := "我真是个乐观向上的好青年"

AHK变量名还包括unicode标准定义的字符,如中文 盒太郎 在AHK中是个合法的变量名,这个可爱之处,在一定程度上照顾了我等英语废的命名痛点。

       由于没有中文标点的语法纠错机制,这也是包容性造就的操蛋之处。如:

, := "我不是个普通的逗号"
。 := "而我也不是个单纯的句号"
“” := "嘤嘤嘤,我是不是放错地方了?"

三、变量分类

AutoHotkey 中没有明确的变量类型.我根据经验总结,ahk的变量类型有以下几种分法:

(一)按照数据类型划分有

  1. 数字型变量
    数字型变量分为两种整型和浮点型,所谓整型就是整数,所谓浮点型就是带小数点的数,举个例子:
    a=18
    b=1.8

    a就是整形,b就是浮点型

  2. 文本型变量,字符串
    a=河许人
  3. 布尔型变量,true/flase,on/off等
    a=true
    b=off

    然而, 只包含数字 (可以含有小数点) 的变量进行数学运算或比较时, 会被自动转换为数值. (为了提高性能, 在内部会对数字进行缓存以避免与字符串之间的转换.)

(二)按照作用域和生命周期划分

分为全局变量、局部变量和静态变量,谈到这里就涉及到两个概念:作用域和生命周期。

这是两个完全不同的概念,虽然很多时候相互关联。作用域是作用在空间上的,比如一个变量在代码的哪些行能访问,哪些行不能访问。而生存期是作用在时间上的,比如一个变量的值在函数返回后是否失效。

全局变量

全局变量比较好理解,如果一个变量是全局变量,那么程序中的所有代码都可以访问到这个变量(除非存在同名的局部变量或者静态变量)。全局变量用 global 定义。

看一个例子。

a := 1
global b := 2
c := 3
fun()
{
; a 不是全局变量,访问不了,弹出空字符串
    MsgBox, % a
; b 是全局变量,弹出 2
    MsgBox, % b
; 在函数里也可以将 c 变成全局变量
global c
; 弹出 3
    MsgBox, % c
}

注意代码里的 a 并不是全局变量,虽然它的作用域要比函数里的局部变量要大,在所有文件的函数外都可以访问,但在函数内它是不能被访问到的,这算是一个特例。

局部变量

在函数里使用的变量通常是局部变量。

fun()
; a 并不是全局变量,弹出空字符串
MsgBox, % a
; b 是全局变量,弹出 2
MsgBox, % b
fun()
{
    a := 1
    global b := 2
}

注意这里 b 是在函数里定义的全局变量,但不管是在什么地方定义的,在其他地方都可以访问到。

静态变量

全局变量和局部变量的作用域和生存期都不一样。全局变量的作用域和生存期都是全局的,局部变量的作用域是在函数内部,生存期是从函数开始执行到函数返回。

但还有一种比较特别的变量是静态变量。

; 弹出 1 1(第一次)
fun()
; 弹出 1 2(第二次)
fun()
fun()
{
    a := 1
    static b := 1
    MsgBox, % a " " b
    a++
    b++
}

a 就是普通的局部变量,因为每次执行 a 都会被初始化为 1,所以两次运行 fun 函数时 a 的值都是 1。但 b 是一个静态变量(使用 static 定义)。静态变量的作用域和局部变量一样,只能在函数内访问。但生存期和全局变量一样,也就是说一个静态变量定义后,它的值会一直有效,即使函数已经返回了。所有第二次运行 fun 函数后,b 的值已经是 2 了。

使用场景

那么什么分别在什么情况下使用三者呢?

没有特殊需求的场景,都应该使用局部变量,这也是默认的情况。

如果一个变量是需要全局有效的,那么使用全局变量。但全局变量会导致代码的耦合度比较高,不方便维护,所以尽量少用。有些看似需要使用全局变量的场景,其实使用函数的参数传递更合理。

如果某个局部变量需要只初始化一次(一般情况是因为初始化有开销,这是主要的场景),或者需要保留上次运行的结果(这会导致代码容易滋生 bug,并且难于测试,尽量少用),那么需要将这个局部变量修改成静态变量。

(三)按照形式划分

可以分为普通变量、内置变量、环境变量,普通变量没什么好解释的了,下面详细讲一讲内置变量和环境变量。

内置变量

AHK中有丰富的内置变量,内置变量的名称多以 A_ 作为前缀,如循环语句中的A_Index, 脚本当前完整路径A_ScriptDir等。

除了编码世界中比较普遍的true/false, 它包含AHK中重要功能项的一些关键参数,帮助文档说明其并非尽数是实时更新的,我们关注引用时的参数内容即可,于本章节不做赘述。

内置大多不可进行赋值操作,且皆属于全局变量的范畴,可以在函数中引用

有一特例ErrorLevel,它可以进行赋值,在个别命令式中无返回值,用于逻辑判断。

命令式是Autohotkey L版本的特色,将在后续章节进行说明。

内置变量就是说这些变量名称已经内置到程序中了, 可以在任何脚本中引用. 除了 Clipboard、ErrorLevel和命令行参数, 其他变量都是只读的; 即它们的内容无法在脚本中直接修改.有哪些内容呢?

Autohotkey内置变量还是比较丰富的,主要分为以下几类:

  • 特殊字符: A_Space, A_Tab
  • 脚本属性: 命令行参数, A_WorkingDir, A_ScriptDir, A_ScriptName, (…更多…)
  • 日期和时间: A_YYYY, A_MM, A_DD, A_Hour, A_Min, A_Sec, (…更多…)
  • 脚本设置: A_IsSuspended, A_BatchLines, A_TitleMatchMode, (…更多…)
  • 用户空闲时间: A_TimeIdle, A_TimeIdlePhysical
  • GUI 窗口和菜单栏: A_Gui, A_GuiControl, A_GuiEvent, A_EventInfo
  • 热键, 热字串和自定义菜单项: A_ThisHotkey, A_EndChar, A_ThisMenuItem, (…更多…)
  • 操作系统和用户信息: A_OSVersion, A_ScreenWidth, A_ScreenHeight, (…更多…)
  • 杂项: A_Cursor, A_CaretX, A_CaretY, Clipboard, ClipboardAll, ErrorLevel
  • 循环: A_Index, (…更多…)

内置变量也绝对是一个神奇的存在,合理运用必然事半功倍,有时候甚至能带给我们很多尖叫,废话不多说,下边我们一起了解一下这个玩意!!!

下边我们就举个例子说明一下:
例:双击ctrl键打开记事本

Ctrl::
if Count<1
{
  if A_TimeSincePriorHotkey<400
  {
    if A_PriorHotkey = %A_ThisHotkey%
    {
      Count++
    }
    else
    {
      Count:=0
    }
  }
  else
  {
    Count:=0
  }
}
else
{
  Count:=0
}
if Count>0
{
  Run notepad
  Count:=0
}
return

上边这段代码中就使用了三个内置变量,分别是A_TimeSincePriorHotkey(上次热键到本次热键被点击的时间间隔,以毫秒计算)、A_PriorHotkey(上次点击的按键)、A_ThisHotkey(当前点击的按键),具体的内容请参考帮助文件。这三个内置变量的使用给我们带来很大的便利。

为什么这么说呢?

大家看,这里边我们用到第一内置变量A_TimeSincePriorHotkey是一个时间间隔,这个要用程序时间的话的,必须先保存上一次点击热键的时间,然后获取当前点击的热键的准确时间,并进行数学运输,获取热键点击的时间必须要一个函数的支持,因此这一个内置变量背后是一大段代码的支持,但是我们直接用就不需要,节省了ahkor多少辛苦的泪水啊!!

其他两个的同样是这个效果我就不一一解释了,感兴趣的朋友请参考帮助文件。

 

这么多类,几百个内置变量的使用方法,大家一下子不可能记住,但是大家可以到帮助文档中浏览一遍,建立第一印象,到使用的时候的能想的起来,不然这么好的东西对你一点用都没有了。

环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。 环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如WindowsDOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

环境变量由操作系统维护. 在命令提示符中输入SET并回车后, 您可以看到环境变量列表.

脚本中可以使用 EnvSet 创建新的环境变量或改变现有环境变量的内容. 但是, 这样的添加和改变都是私有的; 它们不会被系统的其他部分看到. 一个例外是当脚本使用 Run 或 RunWait 运行程序时 (甚至是另一个脚本): 这样的程序会继承其父脚本的环境变量的副本, 包括私有的那些.

在 v1.0.43.08+, 推荐在所有新脚本中使用以下方式获取环境变量, 例如 Path:
EnvGet, OutputVar, Path
关于环境变量的操作,当前课程涉及较少。我会在环境变量控制那一课进行详细阐述,这里略讲。

(四)变量的容量和占用内存

•每个变量最多可以含有64MB的文本(使用#MaxMem可以突破这个限制).
•当赋值给变量比当前更长的内容时, 会自动分配额外的系统内存给这个变量.
•通过赋值为空可以释放大变量占用的内存, 例如 Var := “”.
•脚本可以创建的变量数量没有限制. 程序设计用来支持至少几百万的变量而不会出现明显的性能下降.
•接受数值输入的命令, 函数和表达式通常可以支持 15 位的浮点数精度. 对于整数, 可以支持 64 位有符号整数, 其范围从 -9223372036854775808 (-0x8000000000000000) 到 9223372036854775807 (0x7FFFFFFFFFFFFFFF). 此范围外的任何整数不受支持, 并可能产生错误的结果. 与之相比, 整数的算数运算结果超出此范围时会产生溢出 (例如 0x7FFFFFFFFFFFFFFF + 1 = -0x8000000000000000)。



下面的是拓展内容

四、二进制

在1.2章节计算机结构和运行原理(重点:冯诺依曼结构和程序运行过程)中存储器部分提到计算机的底层都是使用二进制数据进行数据流传输的,那么为什么会使用二进制表示计算机呢?或者说,什么是二进制数呢?再拓展一步,如何使用二进制进行加减乘除?二进制数如何表示负数呢?

(一)为什么用二进制表示

看起来神秘的计算机,其实内部是由IC电子元件组成的,其中 CPU 和 内存 也是 IC 电子元件的一种,CPU和内存图如下:

2.5容器-变量

2.5容器-变量

CPU 和 内存使用IC电子元件作为基本单元,IC电子元件有不同种形状,但是其内部的组成单元称为一个个的引脚。有人说CPU 和 内存内部都是超大规模集成电路,其实IC 就是集成电路(Integrated Circuit)。

2.5容器-变量

IC元件两侧排列的四方形块就是引脚,IC的所有引脚,只有两种电压: 0V 和 5V,IC的这种特性,也就决定了计算机的信息处理只能用 0 和 1 表示,也就是二进制来处理。一个引脚可以表示一个 0 或 1 ,所以二进制的表示方式就变成 0、1、10、11、100、101等,虽然二进制数并不是专门为引脚来设计的,但是和 IC引脚的特性非常吻合。

计算机的最小集成单位为位,也就是比特(bit),二进制数的位数一般为 8位、16位、32位、64位,也就是 8 的倍数,为什么要跟 8 扯上关系呢? 因为在计算机中,把 8 位二进制数称为 一个字节, 一个字节有 8 位,也就是由 8个bit构成。


拓展:为什么1个字节等于8位呢?因为 8 位能够涵盖所有的字符编码,这个记住就可以了。


字节是最基本的计量单位,位是最小单位。

用字节处理数据时,如果数字小于存储数据的字节数 ( = 二进制的位数),那么高位就用 0 填补,高位和数学的数字表示是一样的,左侧表示高位,右侧表示低位。比如 这个六位数用二进制数来表示就是 100111,只有6位,高位需要用 0 填充,填充完后是 00100111,占一个字节,如果用 16 位表示 就是 0000 0000 0010 0111占用两个字节。

我们一般口述的 32 位和 64位的计算机一般就指的是处理位数,32 位一次可以表示 4个字节,64位一次可以表示8个字节的二进制数。

我们一般在软件开发中用十进制数表示的逻辑运算等,也会被计算机转换为二进制数处理。对于二进制数,计算机不会区分他是 图片、音频文件还是数字,这些都是一些数据的结合体

(二)什么是二进制数

那么什么是二进制数呢?为了说明这个问题,我们先把 00100111 这个数转换为十进制数看一下,二进制数转换为十进制数,直接将各位置上的值 * 位权即可,那么我们将上面的数值进行转换

2.5容器-变量

也就是说,二进制数代表的 00100111 转换成十进制就是 39,这个 39 并不是 3 和 9 两个数字连着写,而是 3 * 10 + 9 * 1,这里面的 10 , 1 就是位权,以此类推,上述例子中的位权从高位到低位依次就是 7 6 5 4 3 2 1 0。这个位权也叫做次幂,那么最高位就是2的7次幂,2的6次幂 等等。二进制数的运算每次都会以2为底,这个2 指得就是基数,那么十进制数的基数也就是 10 。在任何情况下位权的值都是 数的位数 – 1,那么第一位的位权就是 1 – 1 = 0, 第二位的位权就睡 2 – 1 = 1,以此类推。

那么我们所说的二进制数其实就是 用0和1两个数字来表示的数,它的基数为2,它的数值就是每个数的位数 * 位权再求和得到的结果,我们一般来说数值指的就是十进制数,那么它的数值就是 3 * 10 + 9 * 1 = 39。

(二)移位运算和乘除的关系

在了解过二进制之后,下面我们来看一下二进制的运算,和十进制数一样,加减乘除也适用于二进制数,只要注意逢 2 进位即可。二进制数的运算,也是计算机程序所特有的运算,因此了解二进制的运算是必须要掌握的。

首先我们来介绍移位 运算,移位运算是指将二进制的数值的各个位置上的元素坐左移和右移操作,见下图

2.5容器-变量

上述例子中还是以 39 为例,我们先把十进制的39 转换为二进制的 0010 0111,然后向左移位 <<一个字节,也就变成了 0100 1110,那么再把此二进制数转换为十进制数就是上面的78, 十进制的78 竟然是 十进制39 的2倍关系。我们在让 0010 0111 左移两位,也就是 1001 1100,得出来的值是 156,相当于扩大了四倍!

因此你可以得出来此结论,左移相当于是数值扩大的操作,那么右移 >>呢?按理说右移应该是缩小 1/2,1/4 倍,但是39 缩小二倍和四倍不就变成小数了吗?这个怎么表示呢?

(三)便于计算机处理的补数

刚才我们没有介绍右移的情况,是因为右移之后空出来的高位数值,有 0 和 1 两种形式。要想区分什么时候补0什么时候补1,首先就需要掌握二进制数表示负数的方法。

二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位当作符号位。 符号位是 0 时表示正数,是 1 时表示 负数。那么 -1 用二进制数该如何表示呢?可能很多人会这么认为: 因为 1 的二进制数是 0000 0001,最高位是符号位,所以正确的表示 -1 应该是 1000 0001,但是这个答案真的对吗?

计算机世界中是没有减法的,计算机在做减法的时候其实就是在做加法,也就是用加法来实现的减法运算。比如 100 – 50 ,其实计算机来看的时候应该是 100 + (-50),为此,在表示负数的时候就要用到二进制补数,补数就是用正数来表示的负数。

为了获得补数,我们需要将二进制的各数位的数值全部取反,然后再将结果 + 1 即可,先记住这个结论,下面我们来演示一下。

2.5容器-变量

具体来说,就是需要先获取某个数值的二进制数,然后对二进制数的每一位做取反操作(0 —> 1 , 1 —> 0),最后再对取反后的数 +1 ,这样就完成了补数的获取。

补数的获取,虽然直观上不易理解,但是逻辑上却非常严谨,比如我们来看一下 1 – 1 的这个过程,我们先用上面的这个 1000 0001(它是1的补数,不知道的请看上文,正确性先不管,只是用来做一下计算)来表示一下

2.5容器-变量

奇怪,1 – 1 会变成 130 ,而不是0,所以可以得出结论 1000 0001 表示 -1 是完全错误的。

那么正确的该如何表示呢?其实我们上面已经给出结果了,那就是 1111 1111,来论证一下它的正确性

2.5容器-变量

我们可以看到 1 – 1 其实实际上就是 1 + (-1),对 -1 进行上面的取反 + 1 后变为 1111 1111, 然后与 1 进行加法运算,得到的结果是九位的 1 0000 0000,结果发生了溢出,计算机会直接忽略掉溢出位,也就是直接抛掉 最高位 1 ,变为 0000 0000。也就是 0,结果正确,所以 1111 1111 表示的就是 -1 。

所以负数的二进制表示就是先求其补数,补数的求解过程就是对原始数值的二进制数各位取反,然后将结果 + 1,

当然,结果不为 0 的运算同样也可以通过补数求得正确的结果。不过,有一点需要注意,当运算结果为负的时候,计算结果的值也是以补数的形式出现的,比如 3 – 5 这个运算,来看一下解析过程

2.5容器-变量

3 – 5 的运算,我们按着上面的思路来过一遍,计算出来的结果是 1111 1110,我们知道,这个数值肯定表示负数,但是负数无法直接用十进制表示,需要对其取反+ 1,算出来的结果是 2,因为 1111 1110的高位是 1,所以最终的结果是 -2。

编程语言的数据类型中,有的可以处理负数,有的不可以。比如 C语言中不能处理负数的 unsigned short类型,也有能处理负数的short类型 ,都是两个字节的变量,它们都有 2 的十六次幂种值,但是取值范围不一样,short 类型的取值范围是 -32768 – 32767 , unsigned short 的取值范围是 0 – 65536。

仔细思考一下补数的机制,就能明白 -32768 比 32767 多一个数的原因了,最高位是 0 的正数有 0 ~ 32767 共 32768 个,其中包括0。最高位是 1 的负数,有 -1 ~ -32768 共 32768 个,其中不包含0。0 虽然既不是正数也不是负数,但是考虑到其符号位,就将其归为了正数。

(四)算数右移和逻辑右移的区别

在了解完补数后,我们重新考虑一下右移这个议题,右移在移位后空出来的最高位有两种情况 0 和 1。当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0,类似于霓虹灯向右平移的效果,这就被称为逻辑右移。

2.5容器-变量

如上图所示,在逻辑右移的情况下, -4 右移两位会变成 63, 显然不是它的 1/4,所以不能使用逻辑右移,那么算数右移的情况下,右移两位会变为 -1,显然是它的 1/4,故而采用算数右移。

那么我们可以得出来一个结论:左移时,无论是图形还是数值,移位后,只需要将低位补 0 即可;右移时,需要根据情况判断是逻辑右移还是算数右移。

下面介绍一下符号扩展:将数据进行符号扩展是为了产生一个位数加倍、但数值大小不变的结果,以满足有些指令对操作数位数的要求,例如倍长于除数的被除数,再如将数据位数加长以减少计算过程中的误差。

以8位二进制为例,符号扩展就是指在保持值不变的前提下将其转换成为16位和32位的二进制数。将0111 1111这个正的 8位二进制数转换成为 16位二进制数时,很容易就能够得出0000 0000 0111 1111这个正确的结果,但是像 1111 1111这样的补数来表示的数值,该如何处理?直接将其表示成为1111 1111 1111 1111就可以了。也就是说,不管正数还是补数表示的负数,只需要将 0 和 1 填充高位即可。

(五)逻辑运算的窍门

掌握逻辑和运算的区别是:将二进制数表示的信息作为四则运算的数值来处理就是算数,像图形那样,将数值处理为单纯的 0 和 1 的罗列就是逻辑

计算机能够处理的运算,大体可分为逻辑运算和算数运算,算数运算指的是加减乘除四则运算;逻辑运算指的是对二进制各个数位的 0 和 1分别进行处理的运算,包括**逻辑非(NOT运算)、逻辑与(AND运算)、逻辑或(OR运算)和逻辑异或(XOR运算)**四种。

  • 逻辑非 指的是将 0 变成 1,1 变成 0 的取反操作
  • 逻辑与 指的是”两个都是 1 时,运算结果才是 1,其他情况下是 0″
  • 逻辑或 指的是”至少有一方是 1 时,运算结果为 1,其他情况下运算结果都是 0″
  • 逻辑异或 指的是 “其中一方是 1,另一方是 0时运算结果才是 1,其他情况下是 0”

2.5容器-变量

掌握逻辑运算的窍门,就是要摒弃二进制数表示数值这一个想法。大家不要把二进制数表示的值当作数值,应该把它看成是 开关上的 ON/OFF。

五、数据

有了二进制,理论上就可以使用二进制编码所有的信息,使用二进制方式存储在内存中代表特定信息的内容就是数据,本质上是二进制的0101

数据的特点:可传递、可运算。

六、内存

内存是系统临时存储数据的设备中的空间,内存分为栈空间(全局变量和局部变量)和堆空间(对象/函数)

内层产生和死亡:内存条==》通电==》产生内层空间==》存储数据==》处理数据==》断电==》内存空间和数据消失

内存中所有操作的目标都是数据

七、总结

关于变量的说明比较抽象,但是我希望这章节能解决新手某些流于语法与基本概念的困扰。

 

 

给TA捐赠
共{{data.count}}人
人已捐赠
其他教程

2.3热键(含命令:keywait、pause/suspend、#if系列、hotkey、settimer)

2021-5-30 20:38:27

其他函数教程

【函数】json转码纯ahk实现-feiyue

2021-5-30 22:17:18

11 条回复 A文章作者 M管理员
  1. user16052

    学习

  2. BL

    我框框学

  3. 特罗

    学习

  4. 无涯

    看看

  5. 无涯

    学习

  6. Pentakill

    基础知识也收积分?

    • 河许人

      有积分部分和非积分部分

  7. 码农

    学习

  8. xijima

    看看

  9. awen162

    积分不够,看不了

  10. 立秋

    var=b

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索