☰
易语言流程控制入门:如果、如果真、判断的选型与实战
2026/10/14 4:38:28 网站建设 项目流程

学易语言只要翻到系统核心支持库的流程控制这一节,就一定会撞上“如果”“如果真”“判断”这三条命令。说实话,我当初学的时候觉得它们长得太像了,都是先判断一下再决定接下来做什么,直到后来写出第一个带校验的登录窗口,才真正明白三条命令的边界在哪。这篇文章就用登录场景当引子,把三者的语法、适用场景和我在项目里踩过的坑一起梳理清楚。适合刚学完变量和数据类型、正准备啃流程控制的同学,也适合写了好几个小工具但总觉得分支结构越写越乱的人。

1. 先用一次登录校验,说清三条命令的分工

1.1 没有流程控制的程序,只会一路平推

你可以做一个最简单的实验:新建一个易语言窗口程序,放一个编辑框和一个按钮,在按钮的单击事件里写一行代码,把编辑框的内容直接显示到标签上。你会发现程序永远按你写代码的顺序老老实实往下跑,没有任何岔路。这就是顺序执行,也是初学者最容易忽视的默认形态。

一旦需求变成“如果输入的是数字,就显示数字;否则提示格式不对”,程序就必须在某一行停下来做选择。这个“停下来选择”的动作,就是流程控制。易语言系统核心支持库里最基础的条件选择命令就是如果、如果真、判断。它们本质上都在干同一件事:把一条直线上的代码变成有分岔的路口。差别在于路口怎么设计,以及你该在什么场景下选哪条路。很多人把这三条命令混着用,最后代码风格完全看心情,其实它们的定位是非常清晰的。

1.2 分支数量与匹配方式:三条命令的分水岭

命令分支结构适合场景执行特点
如果条件成立执行一段,不成立执行另一段二选一,比如“及格/不及格”两个分支总有一个被执行
如果真条件成立执行一段,不成立什么都不做前置校验、失败提前返回可能一个分支都不执行
判断一个表达式与多个值依次匹配状态码、角色、菜单编号等定值分派匹配成功后自动结束判断

有人会问:如果命令功能最强,那我全用如果行不行?语法上完全可以,代价是可读性。比如前置校验里只想要“账号为空就提示并返回”,用如果写:

如果 (账号 = "") 信息框 ("账号不能为空", 0, , ) 返回 () 否则 ' 什么都不写 如果结束

语法没错,可那个空荡荡的否则分支放在真实代码里非常劝退。换成如果真,这个否则直接消失,代码干净得多。同样的道理,多分支如果写成嵌套如果,会变得像俄罗斯套娃;用判断命令平铺开,后续加分支也方便。所以动手写之前先问自己:这个需求是二选一吗?是单条件拦截吗?是要对多个枚举值分派吗?答案分别对应如果、如果真、判断。

2. 逐条拆解语法:如果、如果真、判断的执行逻辑

2.1 如果命令:一题两问的双分支结构

易语言里的如果命令格式非常固定:如果后面跟一个括号,括号里放条件表达式,换行写条件成立时要执行的代码;如果有不成立的情况,就写一个否则关键字,再换行写不成立时要执行的代码;最后用如果结束收尾。一个标准的成绩判断例子是这样:

.版本 2 .程序集 窗口程序集_启动窗口 .子程序 _按钮1_被单击 .局部变量 分数, 整数型 分数 = 到整数 (编辑框1.内容) 如果 (分数 >= 60) 信息框 ("及格", 0, , ) 否则 信息框 ("不及格", 0, , ) 如果结束

这段代码无论分数是多少,都必然执行其中一个分支。100分会看到“及格”,59分会看到“不及格”。如果条件成立时执行的内容比较长,比如几百行,那么否则分支里的代码会离条件判断越来越远,阅读者翻了几百行之后甚至忘了自己是在哪个如果分支里。这也是我后面为什么推荐用如果真做退出式校验的原因。如果命令最强大的地方是它天然覆盖了两个分支,不必额外处理“没进分支”的遗漏场景。

2.2 如果真命令:没有否则的单行道闸机

如果真的语法比如果简单一条街:

如果真 (条件表达式) 条件成立要执行的代码 如果真结束

它只有一个会执行的区域。条件为真,进入;条件为假,什么都不做,直接跳过。最适合它的场景就是“前置拦截”,最常见的组合是“如果真 + 返回”:校验不通过,弹个提示,立刻退出子程序。比如登录前先检查两个编辑框不能为空:

.子程序 登录校验 .局部变量 账号, 文本型 .局部变量 密码, 文本型 账号 = 编辑框1.内容 密码 = 编辑框2.内容 如果真 (账号 = "") 信息框 ("账号不能为空", 0, , ) 返回 () 如果真结束 如果真 (密码 = "") 信息框 ("密码不能为空", 0, , ) 返回 () 如果真结束

这样写的好处是,前面每一条校验都是一道闸机,不通过就抬走,通过就往下一道走。等所有闸机都通过后,后面才是真正的业务逻辑,而且业务逻辑不用缩进到任何分支里,始终平铺在最外层。这个模式在易语言项目里几乎成了我的习惯,尤其是功能越来越复杂之后,前置校验用如果真堆出来的代码,比一堆否则嵌套好维护得多。

2.3 判断命令:等值分派的开关结构

判断命令看起来跟如果很像,但语义完全不同。它的标准形态是先有一个外层判断,外层括号里放一个表达式,通常是变量;然后在下面用若干个判断关键字列出要匹配的值,每个判断关键字对应一个分支;最后用默认处理其他情况。匹配成功后执行完该分支会自动跳到判断结束,不会继续往下匹配。看一个角色分派的例子:

.局部变量 角色, 整数型 角色 = 到整数 (编辑框1.内容) 判断 (角色) 判断 (1) 信息框 ("你是管理员", 0, , ) 判断 (2) 信息框 ("你是普通用户", 0, , ) 默认 信息框 ("未知角色", 0, , ) 判断结束

这里最容易犯的错,是把内层的判断 (1) 想当然地写成判断 (角色 = 1)。判断命令的匹配规则是:外层表达式的结果与内层表达式的结果做相等比较。外层是角色,内层是1,比较的是“角色是否等于1”,结果正确。内层写成“角色 = 1”时,这个表达式的计算结果是一个逻辑型值,拿整数型角色去和逻辑型值比较,要么编译报错,要么结果根本不是你预期的分支。记住这一点,判断命令就不会用错。

3. 同一个登录模块,三种代码风格逐个实战

3.1 需求设定与界面准备

假设我们要实现一个最普通的登录窗口:界面有一个账号编辑框(编辑框1)、一个密码编辑框(编辑框2),还有一个登录按钮(按钮1)。点击登录按钮后,需要依次完成下面几件事:账号非空校验、密码非空校验、账号密码匹配校验、根据角色编号显示不同欢迎语。就这么一个简单需求,三种代码风格写出来差别会非常大,我建议你实际在易语言里新建一个窗口把这些代码跑一遍。

3.2 纯如果写法:直观但嵌套膨胀

第一版用纯如果,代码逻辑是最直观的,每层校验用“否则”包住下一层:

.子程序 _按钮1_被单击 .局部变量 账号, 文本型 .局部变量 密码, 文本型 账号 = 编辑框1.内容 密码 = 编辑框2.内容 如果 (账号 = "") 信息框 ("账号不能为空", 0, , ) 返回 () 否则 如果 (密码 = "") 信息框 ("密码不能为空", 0, , ) 返回 () 否则 如果 (账号 = "admin" 且 密码 = "123456") 信息框 ("登录成功", 0, , ) 否则 信息框 ("账号或密码错误", 0, , ) 如果结束 如果结束 如果结束

这段代码能跑,但问题肉眼可见:每多一层校验,后面就要多一个否则和一个如果结束。等需求加上验证码校验、账号状态判断,嵌套层数很容易冲到五层以上。到了那个时候,改最里面一层条件,得先数清楚自己写了几个如果结束,稍不注意就会把分支弄错。我还见过有人把四层嵌套的代码改到一半,发现漏了一个如果结束,编译器直接把后面所有代码都当成错误,排查起来非常痛苦。

3.3 如果真写法:失败即返回,主流程平铺

同样的逻辑换成如果真以后,结构立刻清爽。三道闸机依次拦截,任何一道不过就弹提示并返回:

.子程序 _按钮1_被单击 .局部变量 账号, 文本型 .局部变量 密码, 文本型 账号 = 编辑框1.内容 密码 = 编辑框2.内容 如果真 (账号 = "") 信息框 ("账号不能为空", 0, , ) 返回 () 如果真结束 如果真 (密码 = "") 信息框 ("密码不能为空", 0, , ) 返回 () 如果真结束 如果真 (账号 /= "admin" 或 密码 /= "123456") 信息框 ("账号或密码错误", 0, , ) 返回 () 如果真结束 信息框 ("登录成功", 0, , )

所有前置校验都在进入主流程之前完成,真正执行登录成功提示的代码落在最后一行,没有任何缩进嵌套。之后要加第四道校验,只需要在密码校验之后再加一个如果真,主流程完全不用动。这也是我后来在大多数项目里采用的标准骨架。对比两个版本,功能完全一样,阅读成本却差了一大截,后者可以把注意力集中在主流程上。

3.4 判断写法:角色分派的平铺开关

登录成功之后往往要区分角色权限。把角色编号传进来:

.子程序 显示角色欢迎 .参数 角色, 整数型 判断 (角色) 判断 (1) 信息框 ("管理员,欢迎回来", 0, , ) 判断 (2) 信息框 ("普通用户,欢迎回来", 0, , ) 默认 信息框 ("未知角色", 0, , ) 判断结束

如果用嵌套如果写三个角色,就算只有三层,光是维护“如果结束”对齐就已经很烦躁了。用判断命令,每个角色一个分支,平铺在同一层。以后角色从三个变成八个,也只是多写几段判断分支,整体结构不会变难看。我还建议在角色比较多的场景里,把每个角色的处理逻辑做成独立子程序,判断命令里只负责“分派”,不负责“执行”,这样整个流程控制会变得非常干净。

4. 条件表达式里的易语言专属坑位

4.1 且、或、取反:中文逻辑运算符与优先级

易语言不用双重与符号和双重竖线,而是用汉字“且”“或”“取反”。这对中文用户很友好,但也带来一个隐藏问题:很多人不重视优先级,凭直觉从左往右读。易语言和大多数编程语言一样,“且”的优先级高于“或”。也就是说,A 或 B 且 C,实际会被解释成A 或 (B 且 C),而不是(A 或 B) 且 C。

我见过不止一个新人在这里翻车,现象是:逻辑上不该进入分支却进去了,调试半天最后发现是小括号的事。比如想表达“用户名是admin且密码正确,或者用户名是root且密码正确”,如果写成:

如果 (账号 = "admin" 且 密码 = "123456" 或 账号 = "root" 且 密码 = "654321")

由于“且”优先,这条条件会被理解成“账号=admin且密码=123456”,或者“账号=root且密码=654321”,其实这个语义恰好对。但如果你想表达的是“(账号=admin 或 账号=root) 且 密码=123456”,就必须显式加括号:

如果 ((账号 = "admin" 或 账号 = "root") 且 密码 = "123456")

结论很简单:做条件判断时,不管优先级记不记得,一律给混合逻辑加上小括号最踏实。这不会降低效率,却能避免整夜排错。

4.2 数据类型不匹配与文本比较细节

编辑框的内容是文本型,要和整数比较必须显式转换。直接写“编辑框1.内容 = 100”在易语言里通常会被编译器拒绝,或者被当成文本和数字的比较,结果不是你想要的。正确写法是:

如果 (到整数 (编辑框1.内容) = 100)

文本比较还区分大小写,“Admin”和“admin”不相等,需要忽略大小写时,先统一用“到小写”或“到大写”处理一遍再比较。另一个容易忽略的是首尾空格。用户输入的内容很可能带着空格,“账号”看起来是admin,实际是“ admin”,直接比较必然失败。我的习惯是所有从编辑框取出来的文本,先过一遍“删首尾空”再参与比较和存储,这个命令在各种文本校验环节里非常实用,能提前挡掉一大批脏数据。

4.3 别被“性能”带偏,维护成本才是大头

有些同学担心判断命令比如果慢,或者如果真执行跳过会影响效率。易语言是把源码编译成本地机器码的,这些条件跳转指令的成本可以忽略不计,你在普通应用里根本感知不到差别。真正吃掉开发效率的是分支结构本身的可读性。

举个例子,一个五层嵌套如果,改一个条件时你要花很大精力确认当前在哪个层级,一旦漏写一个“如果结束”,编译器会报出语句没有对应结尾之类的错误。与其纠结纳秒级的性能,不如先保证代码一眼能看懂。流程控制命令的选择标准应该是维护便利性,不是微乎其微的速度差异。我在实际项目里最大的体会就是:一段结构清楚、平铺直述的流程控制,比任何“高性能写法”都值钱。

5. 我在真实项目里踩过的五个分支大坑

5.1 漏写否则,程序“静默”出错

有一次我在一个库存管理小程序里做库存扣减,写了这样一段代码:

如果 (库存数量 >= 出库数量) 库存数量 = 库存数量 - 出库数量 如果结束

看起来没问题,库存够了就扣减,库存不够就不扣。但后来发现出库数量大于库存时,程序什么都不做,也不提示任何错误,库管员以为出库成功了,直到月底对账才发现库存成了负数。修复很简单,补一个否则分支提示库存不足。但这个bug非常隐蔽,因为程序不报错,只有业务数据对不上才会被发现。教训是:如果命令一旦成立,就要认真对待另一个分支,哪怕它只是弹一句提示,也不能留一个空荡荡的“否则”。

5.2 判断命令的内层分支写成了条件表达式

我见过某开发者这样写:

判断 (状态) 判断 (状态 = 1) 信息框 ("启动", 0, , ) 判断 (状态 = 2) 信息框 ("停止", 0, , ) 默认 信息框 ("未知", 0, , ) 判断结束

他想表达“状态等于1就如何”。但判断命令的匹配规则是外层表达式与内层表达式做相等比较。外层“状态”是整数,内层“状态=1”是逻辑型,两者类型不一致,分支经常不会按预期触发。正确写法是内层直接写值:判断 (1)、判断 (2)。如果确实想用判断命令模拟“否则如果”条件链,可以把外层写成判断 (真),内层写完整条件,匹配逻辑型结果。但这不是判断命令的典型用法,新手最好不要从这里入门。

5.3 用如果真硬套否则逻辑,绕远路

有次我重构别人的代码,看到这样一段:

如果真 (取反 (账号 = "admin")) 信息框 ("没有权限", 0, , ) 返回 () 如果真结束

功能没问题,但读代码的人会在脑子里多算一步:“取反账号等于admin,那就是账号不等于admin”。为什么不直接写不等号呢?易语言里的不等于写法常见的是/=,所以上面的代码可以写成:

如果真 (账号 /= "admin")

同样的意思,后者一眼就能读懂。取反命令不是不能用,而是它更适合用在“对长条件整体取反”的场景,单个简单比较没必要绕一圈。我的原则是:二选一需求直接用如果;单条件拦截用如果真;需要否定某个条件时优先改写成肯定句式,代码会自然顺眼很多。

5.4 比较前不处理首尾空格,登录功能被反复打回

我第一次做登录功能时,测试人员反复提交bug,说用户输入“ admin ”(前后带空格)永远登不上。当时我的校验代码直接比较“编辑框1.内容 = "admin"”,输入内容带一个空格就失败。后来我查了一圈才发现问题根本不在判断命令,而在数据源:用户手输的内容总是带着意想不到的空白字符。从那里以后,我养成了所有从编辑框取文本先“删首尾空”再用的习惯。这个坑不大,但特别常见,尤其真实业务里用户输入远没有教程里的数据那么干净。

5.5 分支过度嵌套,改需求改到怀疑人生

我维护过的一个旧项目里,登录后的权限分流写了三层嵌套如果。后来需求方要加一个新角色,我为了找到该插入的位置,硬是数了十分钟“如果结束”,最后还是决定把它改成判断命令,把所有角色平铺出来。改完之后清晰多了,新增一个角色只需要加一段“判断(角色编号) + 处理代码”,主结构完全不用动。嵌套如果不是不能用,而是当分支数量超过三个,请务必考虑判断命令。这个习惯能帮你省下大量改需求的工时。

6. 从会用到用对:两条练习路径与三条实操建议

6.1 练习一:把过去的嵌套如果代码重构一遍

找一段自己以前写的、至少有三次嵌套如果的小程序。先不动功能,只把结构改成“如果真失败返回 + 主流程平铺”或“判断分派”的写法。然后对比两个版本:哪个更容易看懂?哪个需要加上更多注释才能维护?这种重构练习比刷一百道理论题都有用,因为你会实实在在地感受到分支结构对阅读的影响。我每次带新人也是这么要求的:先不急着学新命令,把你写过的代码拿出来看看哪里绕了,改顺了再继续往下学。

6.2 练习二:用判断命令实现一个订单状态机

模拟一个订单状态:1已下单、2已支付、3已发货、4已完成。界面上放一个编辑框输入状态值,用一个按钮触发判断,分别提示当前状态。先写嵌套如果版本,再改成判断命令版本。你会发现判断版本几乎不用数结束标记,因为所有分支在同一个层级。如果再加入一个“5已取消”,两个版本的修改成本立刻分出高下。这个练习能帮你把判断命令彻底内化成肌肉记忆,以后遇到状态类需求时不用思考,条件反射就会想到用判断。

6.3 三条实操建议

第一条,给每个“如果”和“如果真”都写清楚注释,哪怕只在分支入口写一句“这里处理的是账号为空的情况”。原因很简单:三个月后看这段代码的人大概率是你自己,而你已经忘了当初为什么这么分。第二条,保持一种风格不要混用。判断命令适合定值分派,如果真适合前置拦截,如果适合二选一。如果同一个项目里一会儿用判断、一会儿用嵌套如果表达同样的事情,后来接手的人会花大量时间做无意义的统一工作。第三条,条件判断里的逻辑如果超过三个条件,就别硬塞进一个表达式了,拆成两个如果真,或者用一个局部逻辑型变量逐步叠加,代码的可读性会好很多。

我在实际写易语言程序的过程中最大的感受就是:流程控制不是命令背得熟不熟的问题,而是能不能把一个具体需求翻译成清晰的分支结构。如果你现在正被一堆“如果结束”搞晕,不要急着去背新命令,先停下来,把需求拆成“二选一、单条件拦截、定值分派”三类,再决定用哪条命令。等你练熟了,自然会发现很多代码根本不需要长嵌套,一层平铺的流程控制读起来舒畅得多。最后把本文第二个版本的登录代码保存下来,以后写任何带校验功能的程序,都可以先照着它搭骨架,亲测省心。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询