zoukankan      html  css  js  c++  java
  • 详解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;
            }
        }

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

  • 相关阅读:
    第一章(认识jQuery)
    csv、txt读写及模式介绍
    命令行参数
    WebDriverWait等设置等待时间和超时时间
    js加载页面使用execute_script选定加载位置
    pip镜像源配置
    python字符编码
    scrapy设置代理
    urllib2设置代理
    禁止chrome自动更新
  • 原文地址:https://www.cnblogs.com/wells33373/p/6006477.html
Copyright © 2011-2022 走看看