详解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;
}
}
看出来了,只要是表达式,就能使用啊!除了第二个表达式必须为空,或者布尔值外,其他两个基本没什么限制。第二表达式为空则是死循环。
详解for循环(各种用法)的更多相关文章
- linux 详解useradd 命令基本用法
linux 详解useradd 命令基本用法 时间:2019-03-24 本文章向大家介绍linux 详解useradd 命令基本用法,主要包括linux 详解useradd 命令基本用法使用实例.应 ...
- [转] - JAR文件包及jar命令详解 ( MANIFEST.MF的用法 )
常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像. chm 文档一样双击运行了:而另一种是使用 JET 来进 ...
- 小白学python之整型,布尔值,十进制二进制转换和字符串详解for循环!
整型与字符串转化 十进制转二进制. python2,存在int 整型和long(长整型),在python3里就是int/获取的是浮点数 小数 print(bin(15)) 这样可以通过代码来计算十进制 ...
- 详解python中@的用法
python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,‘@function'作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 ...
- yield关键字详解与三种用法
本篇文章比较硬核, 适合有一定Python基础的读者阅读, 如果您对Python还不甚了解可以先关注我哦, 我会持续更新Python技术文章 yield详解 yield与return相同每次调用都会返 ...
- 实用的PHP功能详解(一)_php glob()用法
一.使用glob()查找文件 大部分PHP函数的函数名从字面上都可以理解其用途,但是当你看到 glob() 的时候,你也许并不知道这是用来做什么的,其实glob()和scandir() 一样,可以用来 ...
- exec族函数详解及循环创建子进程
前言:之前也知道exec族函数,但没有完全掌握,昨天又重新学习了一遍,基本完全掌握了,还有一些父子进程和循环创建子进程的问题,还要介绍一下环境变量,今天分享一下. 一.环境变量 先介绍下环境的概念和特 ...
- react router @4 和 vue路由 详解(二)react-router @4用法
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 2.react-router @4用法 a.大概目录 不需要像vue那样麻烦的 ...
- 面试题:JavaIO流分类详解与常用流用法实例
Java流概念: Java把所有的有序数据都抽象成流模型,简化了输入输出,理解了流模型就理解了Java IO.可以把流想象成水流,里面的水滴有序的朝某一方向流动.水滴就是数据,且代表着最小的数据流动单 ...
随机推荐
- API 进程、线程函数
CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 ConnectNamedPipe 指 ...
- memached 服务器lru算法
1.LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的.LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条 ...
- 项目构建工具Gradle的使用入门(参考,只表明地址)
Gradle入门介绍:简介 http://blog.jobbole.com/71999/ Gradle入门介绍:第一个Java项目 http://blog.jobbole.com/72558/ Gra ...
- 神奇的Noip模拟试题第一试 合理种植 枚举+技巧
1.合理种植 (plant.pas/.c/.cpp) [问题描述] 大COS在氯铯石料场干了半年,受尽了劳苦,终于决定辞职.他来到表弟小cos的寒树中学,找到方克顺校长,希望寻个活干. 于是他如愿以偿 ...
- Delphi日期时间 UNIX
Delphi日期时间,就是常见的 2014-05-02 10:37:35 --------------------------------------------------------------- ...
- Linux-Unix版本介绍
转自: http://blog.163.com/li_zhuangs/blog/static/195698098201182411360635/ < DOCTYPE html PUBLIC -W ...
- Android之sdcard操作
private static final String FILENAME = "abc.txt"; private static final String DIR = " ...
- JVM-运行时数据区
运行时数据区示意图 ...
- C/C++学习之基础-001
1.C++虚函数的工作原理 虚函数(virtual function)需要虚函数表(virtual table)才能实现.如果一个类有函数声明成虚拟的,就会生成一个虚函数表,存放这个类的虚函数地址.若 ...
- 指针属性直接赋值 最好先retain 否则内存释放导致crash
//先释放之前的 YK_RELEASE_SAFELY(_selectedDate); //retain新的 _selectedDate = [aDate retain]; NSString 属性的好像 ...