Chinaunix首页 | 论坛 | 博客
  • 博客访问: 347606
  • 博文数量: 38
  • 博客积分: 1289
  • 博客等级: 中尉
  • 技术积分: 533
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-10 22:30
个人简介

Good Good Study. Day Day Up.

文章分类

全部博文(38)

文章存档

2018年(1)

2016年(3)

2015年(12)

2014年(7)

2013年(10)

2012年(5)

分类: 系统运维

2013-09-12 15:08:28

前几天有个朋友在QQ群里面提的一个问题,代码如下:

@echo on
for /l %%i in (1,1,5) do (
    echo %%i
    if %%i equ 4 (
        goto :end
    )
)

:end
pause

执行过程如下:

d:\Test>test.bat

d:\Test>for /L %i in (1 1 5) do (
echo %i
 if %i EQU 4 (goto :end )
)

d:\Test>(
echo 1
 if 1 EQU 4 (goto :end )
)
1

d:\Test>(
echo 2
 if 2 EQU 4 (goto :end )
)
2

d:\Test>(
echo 3
 if 3 EQU 4 (goto :end )
)
3

d:\Test>(
echo 4
 if 4 EQU 4 (goto :end )
)
4

d:\Test>(
echo 5
 if 5 EQU 4 (goto :end )
)

d:\Test>pause
Press any key to continue . . .

按理说,%%i 等于 4 的时候,就应该跳出 for 循环了,但为什么执行到 5 那里去了呢?原因是,for /l 不管循环体内部是否有跳出循环的语句,它都会遍历完整个循环条件。

我们写个大点的循环来感受一下:

@echo off
for /l %%i in (1,1,5000000) do (
    echo %%i
    if %%i equ 4 (
        goto :end
    )
)

:end
exit

如果你认为它执行到 %%i 等于 4 的时候就会退出,那就错了。它会遍历完 1 到 5000000 的。
阅读(8852) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

amwfjhh2014-11-07 14:48:04

难不成是FOR在运行之初就已经把内存区分配好了,只能按依次寻址的方式将各个指针走一遍,但是到if判断时,给出了主线程下次应该执行代码的指针,但是FOR还是需要一个地址一个地址的对比是否到达主线程应该执行的内存区,所以只对后面的循环执行了“过家门而不入”的情况?

amwfjhh2014-11-07 14:43:48

有点奇怪,按说如果到那个循环里面去了,会执行判断之前的5输出,但是它又未执行输出,在大数循环时又确实看到CPU将之后的流程都走了一遍,难道此它for只有运行权限,没有回显权限了?