详解for循环(各种用法)

常见的for循环一般是一下代码这种结构:

for (int i = 0; i < 100; i++)
{
    Console.WriteLine(i);
}

或者递减的:

for (int i = 100; i > 0 ; i--)
            {
                Console.WriteLine(i);
            }

但for当然不止这样一种用法。for的定义,()内的三段表达式,除了中间的必须产生布尔型,并未对其余两段有所限制,只要是表达式就可以了。在Lucene.Net中就有好几次这样的用法。例如:

for (Token token = input.Next(result); token != null; token = input.Next(result))
{
     int len = token.TermText().Length;
     if (len >= min && len <= max)
     {
         return token;
     }
}

这个语句和下面代码的效果是一样的:

Token token;
            while((token = input.Next(result)) != null)
            {
                int len = token.TermText().Length;
                if (len >= min && len <= max)
                {
                    return token;
                }
            }

其实我认为在这两种循环中,第二种比第一种好理解一点。

还有这种

for (i = 75; i-- > 0; )
    jjrounds[i] = 0x80000000;

出了一个空表达式,其实理解一下也很简单,和下面代码的效果一样:

for (i = 75; i > 0; i--)
    jjrounds[i] = 0x80000000;

朋友留言指正,修正以上代码为:

for(i = 74;i > 0;i--){

jjrounds[i] = 0x80000000;

}

又弄错了,接受批评。应该换成下面的

for(i = 74; i >= 0;i--)

jjrounds[i] = 0x80000000;

空表达式,也是一个表达式啊,放在这里也不犯法。

嘿嘿,还有其他的表达式,比如:

for (int i = 0; i < length; i++, pos++)

这个应该不难理解,第三个表达式有两个,第一个当然也可以有两个

比如            for (int i = 100, j = 100; i > 0 ; i--,j++)

中间的表达式要想用两个就要加运算符了for (int i = 100, j = 100; i > 0 || j>0 ; i--,j++)

这样就总结出三种for循环样式

1、for(int i = 0;i < 100;i++)  //递减和递加的算一种

2、for(;true;)     //有空表达式的

3、for (int i = 100, j = 100; i > 0 || j>0 ; i--,j++)   //有多表达式的

好像就这么多了。但是还有一种,我无法理解的表达式

for(;;)这是个 死循环 无限循环(没有跳出语句,才能成为死循环),汗!!!庐山瀑布汗啊,反正我理解不了。

理解上面的表达式,基本上看别人的代码就不会摸不着头脑了。那是不是真的没有了呢?

来试试这种

static void Main(string[] args)
        {
            for (Act(); ; )
            {

}
            Console.Read();
        }

static void Act()
        {

}

注意:没见过有这么用的,纯粹是实验,应用产生的后果我不负责啊。

放上三个方法爽爽:

static void Main(string[] args)
        {
            for (Act1(); Act2(); Act3())
            {

}
            Console.Read();
        }

static void Act1()
        {

}

static bool Act2()
        {
            return true;
        }

static bool Act3()
        {
            return true;
        }

当然,你非要用个委托,我也没意见:

delegate void Bind();
    class Program
    {
        static void Main(string[] args)
        {
            Bind b = new Bind(Act1);
            for (b(); Act2(); Act3())
            {

}
            Console.Read();
        }

static void Act1()
        {

}

static bool Act2()
        {
            return true;
        }

static bool Act3()
        {
            return true;
        }
    }

我考事件也出来了:

delegate void Bind();
    class Program
    {
        static event Bind bindEvent;

static void Main(string[] args)
        {
            Bind b = new Bind(Act1);
            bindEvent += new Bind(Program_bindEvent);
            for (b(); Act2(); bindEvent())
            {

}
            Console.Read();
        }

static void Program_bindEvent()
        {
           
        }

static void Act1()
        {

}

static bool Act2()
        {
            return true;
        }

static bool Act3()
        {
            return true;
        }
    }

看出来了,只要是表达式,就能使用啊!除了第二个表达式必须为空,或者布尔值外,其他两个基本没什么限制。第二表达式为空则是死循环。

时间: 2024-08-01 06:42:32

详解for循环(各种用法)的相关文章

实例详解C#抽象类及其用法(转)

今天学习抽象类和方法,对应该什么时候使用大伤脑筋,百度文库中找到一篇<实例详解C#抽象类及其用法>,觉得该例子通俗易懂,很好地解释了为什么要使用.如何使用抽象类和抽象方法,遂复制过来留存. 假如现在要开发一个模拟CS的游戏.要求如下: 1.游戏中要有恐怖分子,一个恐怖分子一次只能持有一支枪 2.游戏中有多种枪支 3.恐怖分子可以选择枪支使用 4.恐怖分子可以开枪杀人仅此4条,为了使程序足够简单,能说明我们主要目标就行,所以我们用控制台程序来模拟实现. 方法1我们先来看第一种实现情况,假设,游戏

[转] - JAR文件包及jar命令详解 ( MANIFEST.MF的用法 )

常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像. chm 文档一样双击运行了:而另一种是使用 JET 来进行 编译.但是 JET 是要用钱买的,而且据说 JET 也不是能把所有的 Java 程序 都编译成执行文件,性能也要打些折扣.所以,使用制作可执行 JAR 文件包的方法就是最佳选择了,何况它还能保持 Java 的跨平台特性. 下面就来看看什么是 JAR 文件包吧: 1. JAR 文件包 JAR 文件

逻辑卷LVM 应用之详解! VG LV用法 !

一.逻辑卷是什么? 1.lvm:全称logical volume manager,即逻辑卷管理器. 2.那么lv即逻辑卷究竟是什么? 个人认为:逻辑卷就是把一个或多个物理磁盘设备组织为一个由相同大小的存储单元                  PE构成的逻辑卷组VG之后,从次卷组上划分若干存储单元PE构成的一个逻              辑卷LV,因此LV是相对于VG而存在的,它的存在相当于从VG这个大的逻辑                  磁盘上分出去的一个分区,仅此而已.因此,逻辑卷LV

一起学python 三 --字符串详解,for循环

1.整型 n = 56 print(n.bit_length()) #查看值用几位(bit) # python2 中有长整型 long # python3 中全都是整型 2.bool True False print(boll(num)) #非0数字输出Ture 数字0输出False 所有空的都是False 0,None,[],{},(),"" print(int(True)) 1 print(int( False)) 0 ## 字符串转布尔值的时候,只要不为空就是Ture3.字符串详

整型和布尔类型的转换 &amp; 字符串详解 &amp; for循环

整型以及布尔值转换 整型 整型----数字(int)用于比较和运算 32位: -2 ** 31 - 2** 31-1 64位:-2 ** 63 - 2** 63-1 + - * / // ** % 十进制,二进制,十六进制,八进制,二进制 十进制表示方法:123456 二进制表示方法:0101 十进制--二进制(从下往上?2) 15 1 7 1 3 1 1 1 #################### 188 0 94 0 47 1 23 1 11 1 5 1 2 0 1 1 # 从下往上计算

yield关键字详解与三种用法

本篇文章比较硬核, 适合有一定Python基础的读者阅读, 如果您对Python还不甚了解可以先关注我哦, 我会持续更新Python技术文章 yield详解 yield与return相同每次调用都会返回一个值, 不同的是return返回值后会直接结束函数执行, 而yeild则是返回值后冻结函数执行, 下次调用此函数会从冻结处开始执行 (冻结就是保存函数状态, 所有的局部变量与执行状态都会被保留) yield语法 send参数 yield 返回值 语法分为三个部分, 除yield关键字外其它两个部

【python】详解map函数的用法之函数并行作用解析

Python函数编程中的map(func, seq1[, seq2,-]) 函数是将func作用于seq中的每一个元素,其中seq须是可迭代对象,并将所有的调用的结果作为一个list返回.如果func为None,作用同zip(). 本文参考自:Python中map()函数浅析一文,感谢精彩分享. 下面举得例子来帮助我们更好的理解这个工作过程: 1.对可迭代函数'iterable'中的每一个元素应用'function'方法,将结果作为list返回. 2.如果给出了额外的可迭代参数,则对每个可迭代参

Android清单文件详解(四) ---- backupAgent的用法

在<application>节点中有一个非常重要的属性,那就是backupAgent.这里我们将它单独列出来,从基本含义,用法及其相关属性等方面来详细介绍一下. 1.backupAgent简介 android:backupAgent用来设置备份代理.对于大部分应用程序来说,都或多或少保存着一些持久性的数据,比如数据库和共享文件,或者有自己的配置信息.为了保证这些数据和配置信息的安全性以及完整性,Android提供了这样一个机制. 我们可以通过这个备份机制来保存配置信息和数据以便为应用程序提供恢

详解Java中Map用法

Map以按键/数值对的形式存储数据,这里要特别说明( Map.Entry,是Map的内部类,它用来描述Map中的键/值对). Map是一个接口,我们平时多用它的实现类HashMap. 用例如下: public static void main(String args[]) { HashMap hashmap = new HashMap(); hashmap.put("Item0", "Value0"); hashmap.put("Item1",