循环结束条件要不要写超集?有什么好处?

2019-03-03 11:17:21 +08:00
 lhx2008
一直以来都是这么写循环
for (int i = 0; i < N; i++)

但是其实 i < N 是结束条件的超集,有时候如果情况比较复杂,准确写出超集似乎给写程序带来不必要的麻烦。

如果我们这样写
for (int i = 0; i != N; i++)

就准确指出了终止条件是当 i == n 时,而且 i 肯定是能到 N 的。但是甚少有人这么写,所以这背后有什么讲究呢。这两种写法各有什么优劣呢。
2347 次点击
所在节点    问与答
25 条回复
richard1122
2019-03-03 15:47:43 +08:00
@ipwx

不知道你在说啥,1 .. 10 这种只是 kotlin 提供的众多语言特性之下,库函数提供的一个运算符而已,喜欢用的人把它当作一个语法糖也没问题。
它既不是什么“最基本的功能”,也不是“语言的设计思路”,自己立一个靶子打没意思。
richard1122
2019-03-03 15:49:59 +08:00
然后才看到楼上提到 python 是左闭右开,而 kotlin 正好相反是左闭又闭的。
同时它提供了左闭右开的另一个函数 until
ipwx
2019-03-03 16:35:52 +08:00
@lhx2008 但是对于 Python 而言,range 是 Python 很早就有的基本写法。而且 Python 就一个语法,range,其他都是用户选择的自己的写法。把 Python 的 range 和其他语言比较,然后说 Python 的 range 不清晰,不通用,这就是傲慢。

因为你在写 Python 不是吗? Python 自己又没有什么一会儿左闭右开,一会儿左开右闭的。所有 Python 的写法,从 range 到 [start: end: step] 这种 slice,都是左闭右开啊。放在一起,它们自己非常融洽,这不就是优雅的语言了吗?
- - - -

@richard1122 好吧,我反正不会 Kotlin,你说啥就是什么吧。。。
ThomasZ
2019-03-03 16:51:37 +08:00
i!=n 这个条件限制范围过于窄,如果你循环体内不慎对 i 进行了自增操作,那么久很有可能跳过 i=n 这个条件导致循环无法终止
Cbdy
2019-03-03 17:52:26 +08:00
第一种主要是 C 风格的,第二种主要是 C++( STL )风格的。这个在 C++ Primer 有介绍

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/540504

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX