中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » if……else……语句中值得注意的一个问题
« [1] [2] »
作者:
标题: if……else……语句中值得注意的一个问题 上一主题 | 下一主题
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『楼 主』:  if……else……语句中值得注意的一个问题

  刚才在和anqing在讨论一段代码的时候,无意中发现了if……else……语句的一个特点,特发出来,以期引起大家的注意,以免在写代码的时候走弯路:

  我们知道,if语句在判断多个条件是否成立的时候,可以用 if 条件 if 条件……命令 的格式,但是,如果要用 if 条件 if 条件……(命令) else (命令) 的格式,你可能觉得没什么问题吧?

  实际上,红色部分的语句是错误的,此时if语句执行情况如下:

  1、如果if条件都成立,else之前的命令可以正确执行;
      2、如果if中某些条件不成立:
    a) 如果最后一个条件不成立,其他条件都成立,那么,else之后的命令能正确执行;
    b) 如果最后一个条件成立,其他条件中有一个不成立,else之后的命令将不会执行。
(本条有错误,请看6F和7F的分析)

[ Last edited by namejm on 2006-11-1 at 08:59 PM ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-8-19 18:03
查看资料  发短消息 网志   编辑帖子
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 2 楼』:  

a) 如果最后一个条件不成立,其他条件都成立,那么,else之后的命令能正确执行;
b) 如果最后一个条件不成立,无论其他条件是否成立,else之后的命令将不会执行。

你这两句本身就有矛盾。是不是打错了?
else 应该是最近匹配原则,IF 条件连用其实是 IF 的嵌套吧。

2006-8-19 18:16
查看资料  发短消息 网志   编辑帖子
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 3 楼』:  

  呵呵,确实是打错了。已经改过来了。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-8-19 18:27
查看资料  发短消息 网志   编辑帖子
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 4 楼』:  

良好的书写习惯应该对于可能出错的情况,适当地用括号()把各条件包起来。

2006-8-20 14:31
查看资料  发送邮件  发短消息 网志   编辑帖子
doscc
中级用户




积分 256
发帖 93
注册 2006-3-26
来自 广东
状态 离线
『第 5 楼』:  

3742668 版主 说得很对 "良好的书写习惯应该对于可能出错的情况,适当地用括号()把各条件包起来。"

" if 条件 if 条件……(命令) else (命令) " 这句有问题!
可以这样写
if 条件 ( if 条件 ( if 条件 () ) else (不成立执行的命令) ) else (不成立执行的命令)

2006-8-20 16:15
查看资料  发短消息 网志   编辑帖子
220110
荣誉版主




积分 718
发帖 313
注册 2005-9-26
状态 离线
『第 6 楼』:  



  Quote:
 1、如果if条件都成立,else之前的命令可以正确执行;
      2、如果if中某些条件不成立:
    a) 如果最后一个条件不成立,其他条件都成立,那么,else之后的命令能正确执行;
    b) 如果最后一个条件成立,其他条件中有一个不成立,else之后的命令将不会执行。

你的2.b) 是不成立的。
if语句多层嵌套,是从上层逐步往里深入判断执行,当最里层(即你说的最后一个条件)的判断完后,再逐步脱层返回前一层。当你了解汇编时,其实不过是push & pop 的过程,一层层解析并push 进栈,完了,再一层层pop 返回。
我所了解的几种编程语言 if .. else .. 语句,else 都是最近匹配原则。
看来namejm 对编程语言的语法的了解还需深入。哈


写了个例子:

  Quote:
::把50~90分成多个区间,判断一个整数位于哪区间.


@echo off
set /p n=请输入个整数:
if %n% geq 50 (
        echo ^> 50
        if %n% geq 60 (
                echo ^> 60
                        if %n% geq 70 (
                                echo ^> 70
                                if %n% geq 80 (
                                        echo ^> 80
                                                if %n% geq 90 (
                                                        echo ^> 90
                                                        ) else (
                                                                echo ^< 90
                                                                )
                                ) else (
                                        echo ^< 80
                                        )
                        ) else (
                                echo ^< 70
                                )
               
        ) else (
                echo ^< 60
                )
) else (
        echo ^< 50
        )
       
       

[ Last edited by 220110 on 2006-8-20 at 21:39 ]

附件 1: fm.JPG (2006-8-20 17:52, 37.04 K, 下载附件所需积分 1 点 ,下载次数: 15)


2006-8-20 17:52
查看资料  发送邮件  发短消息 网志   编辑帖子
220110
荣誉版主




积分 718
发帖 313
注册 2005-9-26
状态 离线
『第 7 楼』:  

简单画了个三层嵌套的流程图:

  Quote:
            if (第一层条件)
                |
                |------>
                |       |
                |       if (第二层条件)
                |                |               
                |                |------>
                |                |            |
                |                |                if (第三层条件)
                |                |                |   
                |                |                |------>[第三层条件为真时命令]  
                |                |                |                               
                |                |                else -->[第三层条件为假时命令]                   
                |                |                |
                |                |<-------
                |                |
                |                else [第二层条件为假时命令]
                |                |
                |                |
                |<-------
                else [第一层条件为假时命令]                                



2006-8-20 17:54
查看资料  发送邮件  发短消息 网志   编辑帖子
zokping
新手上路





积分 2
发帖 1
注册 2006-11-3
状态 离线
『第 8 楼』:  谢谢

谢谢。我终于可以了

2006-11-3 08:23
查看资料  发送邮件  发短消息 网志   编辑帖子
weilong888
银牌会员




积分 1270
发帖 548
注册 2004-5-31
状态 离线
『第 9 楼』:  

这些东西确实是复杂啊,如果运用自如的话,可以算是能人了。

2006-11-3 08:43
查看资料  发送邮件  发短消息 网志  OICQ (314295922)  编辑帖子
weikiss
初级用户

Q群:IT永恒国度367763 ...



积分 44
发帖 21
注册 2006-11-12
状态 离线
『第 10 楼』:  

在DOS下不能"if 条件 if 条件……命令 的格式",只能用WINDOSXP里.
本来我的启动盘一定用到"if 条件 if 条件……命令 的格式"但是不能使用,但在WINXP中能执行所要的结果.

很希望版主及各位网友以后写贴,说明版本(DOS或windows).两者区别太大了



Q群:IT永恒国度3677635 高明人上门维修电脑群28387927[维修软件总部]fsgm.ys168.com
2006-11-18 19:36
查看资料  发送邮件  发短消息 网志   编辑帖子
hxuan999
中级用户

DOS之日


积分 337
发帖 161
注册 2006-11-4
状态 离线
『第 11 楼』:  

对,是有很大的区别,晕呀.



for /f %%h in (`echo hxuan`) do for /f %%x in (`echo hxuan`) do if %%h==%%x nul
2006-11-23 07:22
查看资料  发送邮件  发短消息 网志  OICQ (33899867)  编辑帖子
htysm
高级用户




积分 866
发帖 415
注册 2005-12-4
状态 离线
『第 12 楼』:  

220110牛啊。

2007-2-16 05:18
查看资料  发送邮件  发短消息 网志   编辑帖子
DOSforever
金牌会员





积分 4639
发帖 2239
注册 2005-1-30
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by weikiss at 2006-11-18 19:36:
在DOS下不能"if 条件 if 条件……命令 的格式",只能用WINDOSXP里.
本来我的启动盘一定用到"if 条件 if 条件……命令 的格式"但是不能使用,但在WINXP中能执行所要的结果.

很希望版主及各位网友以后写贴,说明版本(DOS或windows).两者区别太大了

DOS下不能 "if 条件 if 条件……" 命令的格式?

if 1==1 if a==a ver

你看能不能执行。

最后一点你说的好!



DOS倒下了,但永远不死
DOS NEVER DIES !

投票调查:
http://www.cn-dos.net/forum/viewthread.php?tid=46187

本人尚未解决的疑难问题:
http://www.cn-dos.net/forum/viewthread.php?tid=15135
http://www.cn-dos.net/forum/viewthread.php?tid=47663
http://www.cn-dos.net/forum/viewthread.php?tid=48747
2007-2-16 06:28
查看资料  发短消息 网志   编辑帖子
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 14 楼』:  

if ... command else if ... command else if ... command1 else command2
并列条件

if ... if ... if .... command1

if ... if ... if ... command1 else command2
2b在这样格式的结论是正确的呀

if ... (
if ... (
if ... (
command0) else (command3)
) else (command2)
) else (command1)
这样格式2b就不成立了

累积条件

2007-2-16 18:39
查看资料  发短消息 网志   编辑帖子
gne3
高级用户

DOS学徒


积分 526
发帖 252
注册 2007-2-12
状态 离线
『第 15 楼』:  

学习了

2007-2-16 22:59
查看资料  发短消息 网志   编辑帖子
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: