典型的C风格for语句需要++运算符;如果要在C风格for循环内写较复杂的逻辑,还需要逗号运算符的支持。不少语言把它俩给ban了。
foreach语法确实比单独的for要清晰明确。
当然foreach会损失一定的灵活性(例如说多个并列条件或者自定义步长等),但这些场景还是可以通过一定的语法糖来改善,实在太复杂的情况还有while来兜底……完全够用。
实际上c语言同时设计了for和while两个功能、场景、封装层次基本一样循环语法,确实就是有点多余的。
那么既然for和while重叠了,为了语法的清晰简洁,要砍掉一个的话,是砍掉while还是砍掉for,结论就非常显而易见了吧?
在众多编程语言中间,C语言本来就是个异类~~
只是C太流行了,引得几大主流语言c++、java、c#都沿用了c的语法习惯。javascript之类的又模仿了java的语法,这些语言也叫类c语言,至少看上去和c语言类似。
所以,逻辑关系是:只有类C语言,才会采用C语言的for循环语法。
除此之外的语言一般都不用c语言的for语法,有些语言甚至都不用分号,想用for也不可能。
总之,不采用for语法才是编程语言的默认选项。采用c语言for写法的语言反而是少数派。
因为 for 循环的本质是 bounded loop,但它有更好的替代品(比如:foreach)。
for 循环也可以支持 unbounded loop,但这种情况应该用 while 。
因为C风格的for循环有太多不确定的地方,这些东西都非常的不直观:
典型的C风格的for循环像这样:
for( initialize; condition; increment ) statement( block);
那么存在这么一大堆问题:
这些问题的答案当然都是明确的,但都是完全不直观的。
人生苦短,没事记这些玩意儿干啥?
而反观while循环:
while( condition ) statement( block);
既没有initialize,也没有increment,所以这些问题都不存在:
PS:
statement( block) = statement or statement block,语句或语句块。
另外评论/答案中有人提到,for用分号分隔的三个部分都是语句,这是不对的,condition和increment部分是表达式而不是语句……
再补充一点好了,for循环不讨喜的很重要一个原因我觉得是上不上下不下。
论简洁,当然是while循环最简单,一看就懂,不需要额外的记忆。
如果限定在特定的遍历的场景下,for循环又不像foreach那样舒服,太多细节要自己处理。
唯一可圈可点的地方就是可以限制initialize里面declare的变量的可见范围和生命周期。
但是这又是for的另一个命门,因为只有一个statement,所以没法初始化不同类型的两个变量,或者在没有逗号表达式的语言里面做一些额外的初始化操作。
基本上除了个int i = 0也玩不出什么花,increment也是一样,除了i++、i--也很难做点别的事情。如果把要执行的东西放increment又很怪异。
这就是上不上下不下,看起来,很多细节暴露给你可以去处理,但实际用起来,这也用不了,那也用不了。最后发现只适合遍历。
更何况对于C/C++语言程序员来说increment很大程度上就是多余的:
for( int i = 0; i++ < 10; )
有时候觉得,搞个只有两个部分的的for循环更好用,increment除了可以在continue的时候被执行,其实直接写到循环尾部或者头部不一样么?
而新出的语言则直接用别的语法支持遍历,那for循环保留的意义就没了。
不是“其他语言抛弃了 C 语言的 for 语句”,而是“C 语言抛弃了 Algol 60 的 for 语句,其他语言没有抛弃”。
Algol 60 的 for 语句一般长这样:
for i := 1 step 1 until 10 do outinteger(1, i);
也可以长这样:
for i := 2, 4, 6, 7, 8 do outinteger(1, i);
甚至可以混起来用。
这种“指定一个数值序列,让循环变量依次取序列中的每个数”的 for 循环才是原版的 for 循环。而 C 语言那种可以塞任意三个表达式的 for 语句是异类。
而这个异类比原版多的功能,就是更容易写出奇形怪状的代码了……
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有