关于使用for循环
有人喜欢使用for
作类似while
的循环:
for(;;) { }
评论:这是一种风格,有一部分人使用,我个人觉得不如while
来得直观。
究竟是++i
,还是i++
for (int i = 0; i < arrayA.Length; ++i) { }
for (int i = 0; i < arrayA.Length; i++) { }
以前我使用i++
的写法,后来,看到一些优秀的代码中,大多使用++i
,我就改用++i
了。为什么使用++i
,看到过一些理由,但觉得那些理由,不值一提。
使用i
, j
, k
作多层循环
for (int i = 0; i < arrayA.Length; ++i)
{
Object[] arrayB = arrayA[i];
for (int j = 0; j < arrayB.Length; ++j)
{
Object b = arrayB[j]; //此处需要多加注意,一不留神就会写成Object b = arrayB[i];
}
}
使用i
, j
, k
做多层循环时,很容易犯错误,如上述代码中的注释缩写的那样。我参加的代码评审(Code Review)中,或者开发过程中,经常有同事遇到这种BUG。我也曾经吃过亏,每次编写i
, j
, k
多层for
循环时,就会提醒自己,小心,别犯错误!
使用for
的习惯,除了++i
和i++
的写法不同外,还有和if
、while
等语句一样的不同写法,如下:
第一种写法
a、关键字for
后面有空格
b、二元表达式左右有空格
c、每个大括号,单独占一行
d、else
关键字单独占一行
for (int i = 0; i < list.Count; ++i)
{
}
第二种写法:
a、关键字if
后面有空格
b、二元表达式左右有空格
c、大括号放在上一句的右边
for (int i = 0; i < list.Count; ++i) {
}
需要优化是,可能你也会采用这种写法:
int listCount = list.Count;
for (int i = 0; i < listCount; ++i) { }
如果for
循环中,不会添加或者删除list
的元素,使用这种方式优化,可能得到一丁点(可能不值一提)的性能提升。
需要从list
中删除元素时,可能你会使用反序的遍历。如下:
int listCount = list.Count;
for (int i = listCount - 1; i >= 0; --i)
{
if (condition)
{
list.RemoveAt(i);
}
}
如果list
的实现是ArrayList
,反序遍历可能比正序删除的性能更高一些。
此外,for
还有一些其他的使用方式,如:
for (init(); condition(); incement()) { }
for (; i < j; ++i, --j) { };
1楼
个人感觉
for
比while
灵活,while
比for
清晰。
2004-07-23 05:53 | 正红花油
2楼
看过一些温少的post,感觉得出温少的功力很深哦
但有些时候,有一种意犹未尽的感觉,似乎对“为什么”讲的不够深入
2004-07-23 09:30 | kwklover
3楼
@kwklover
谢谢你的夸奖,我希望我的工作对大家有所帮助!
你谈到,有时候,我的post对“为什么”讲的不够深入,原因可能是:
1、技术水平有限,无法阐述清楚。
2、文笔不够好,写得不清楚。
3、对公司内技术保密,与工作关系比较密切的内容,尽量避免讨论深入。
4、法律纠纷问题。如我共享的ASP .NET的资料,讨论到相关问题,尽量避免把事情说白了,大家意会就好了。
2004-07-23 19:11 | 温少
4楼
觉得温少写的内容不算深,但还有点意思 偏向研究代码、算法,而不是界面控件
2004-07-23 22:28 | JohnnyHu
5楼
以前用C养下的习惯喜欢使用
for(;;)
for
语句的使用比较频繁,干脆就都for
了for(;;)
这种 无限循环的模式很容易识别
很多编译器都能优化这种循环while(True)
就不一定了
2004-07-23 22:29 | Meyer
6楼
我还是看不出 前后有什么不同
Object b = arrayB[j]; //此处需要多加注意,一不留神就会写成Object b = arrayB[j];
2004-07-23 22:31 | JohnnyHu
7楼
@JohnnyHu ,这是原文的笔误,已经修改过来了。
应该是:Object b = arrayB[j]; //此处需要多加注意,一不留神就会写成Object b = arrayB[i];
谢谢JohnnyHu,帮我找到了一个BUG。
2004-07-23 23:46 | 温少
8楼
@JohnnyHu 说的很对,我这里的文章其实都比较明明白白,没有太多底层的内容。我已经大约两年没怎么写界面了,都是写一些后台运行的代码。
2004-07-24 03:20 | 温少
9楼
对于
int
来说i++
和++i
可以认为是没有差别的.
但是如果是对象obj++
与++obj
是不一样,因为obj++
会生成一个临时对象.
2004-07-24 17:01 | dumbo
10楼
自增运算符对操作数加1,因此
x = x + 1;
与下面一样:x++;
自增运算符既可以放在操作数前面(前缀),也可以放在操作数的后面(后缀)。例如,x = x + 1;
可以写成:++x
或者是x++
;
在上面示例中,自增运算符作为前缀或后缀是没有区别的。
然而,当自增运算符作为一个较大表达式的一部分时,情况就大相径庭了。当自增运算符在操作数之前,Java会先将操作数的值用于表达式,然后再进行自增运算。你看下面的例子x = 10;
y = ++x;
值为11
然而如果代码是下面这样
x = 10;
y = x++;
y值将会是10
这两个例子中,x的值都为11。不同之处在于何时进行自增运算。
这样可以十分便利地控制自增操作发生的时间
2005-04-18 20:26 | 复活的幽灵