因为C风格的for循环有太多不确定的地方,这些东西都非常的不直观:

典型的C风格的for循环像这样:

for( initialize; condition; increment )statement( block);

那么存在这么一大堆问题:

  1. initialize声明的变量可见性范围是?生命周期是?
  2. condition在第一次循环结束后还是开始前判断?
  3. increment在第一次循环前执行还是第一次循环后执行?
  4. 循环结束后,是先执行increment还是先判断condition?
  5. initialize是否允许同时初始化多个变量?
  6. initialize和increment都可以省略,那么condition是否可以省略?省略后是不是等价于true?

这些问题的答案当然都是明确的,但都是完全不直观的。

人生苦短,没事记这些玩意儿干啥?

而反观while循环:

while( condition )statement( block);

既没有initialize,也没有increment,所以这些问题都不存在:

  1. initialize声明的变量可见性范围是?生命周期是?
    没有initialize,所以不存在这个问题
  2. condition在第一次循环结束后还是开始前判断?
    condition放在statement前面,显然是在第一次循环开始前判断,要在第一次循环结束后判断可以用do...while。
  3. increment在第一次循环前执行还是第一次循环后执行?
    没有increment,所以这个问题不存在
  4. 循环结束后,是先执行increment还是先判断condition?
    因为没有increment,这个问题也不存在
  5. initialize是否允许同时初始化多个变量?
    因为没有initialize,这个问题也不存在
  6. initialize和increment都可以省略,那么condition是否可以省略?省略后是不是等价于true?
    condition显然不能被省略,其他俩压根儿没有。

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 语句?相关推荐

  1. c语言查看cpu温度代码_很多程序员都不知道,C语言中还有“快类型”和“小类型”...

    虽说C语言是一门很成熟的编程语言,但是近些年来也是有所发展的,从早期的C89到后来的C99.C11等新标准,C语言逐步增加了许多好用的功能,例如新标准头文件"stdint.h"的添 ...

  2. python是一种什么编程语言-想自学一种编程语言,各种编程语言都有什么区别?...

    我自己在五六年前开始自学编程,那个时候就简单学了一些Python,慢慢也就就上手了,后面继续慢慢学,慢慢体验,随之也转到了计算机专业.我就来说说我对自学编程的看法吧. 这个问题下很多不错的回答,也都讲 ...

  3. 当Java、C++、Python等编程语言都变成妹子。。。

    试想一下,当Java.C++.Python.Ruby.PHP.C#.JS等编程语言变成了动漫人物会是怎样的一幅场景呢?下面就一起看看在日本作家渡辺将人的笔下,各种编程语言都是哪类"美女&qu ...

  4. Python能做的事情很多别的编程语言也能做,python将会是昙花一现吗?看看这位程序员怎么说~

    python已经火了几十年了.它是一个1989年诞生的语言,很可能比你都老. 现在的火爆,其实是因为它本身的能力一直在 脚本与科学计算,这两种领域.虽然它本身在Web开发这个实际上应用最多的领域也有不 ...

  5. 想自学一种编程语言,各种编程语言都有什么区别?

    C:1973年的贝尔实验室中,Ken Thompson和Dennis Ritchie在做UNIX系统内核移植开发时,感觉使用汇编语言很难实现,于是使用BCPL开发,并对其改进推出了B语言,但B语言开发 ...

  6. 编程都该学什么语言?几个流行编程语言对比

    随着科技的快速发展,软件开发行业迅速火起来,无论是人工智能还是大数据分析,都是需要用到编程来实现相应的功能.编程的广泛被利用,提升了编程的价值,现在无论是成人还是小孩都开始学习编程.我们应该怎样去学习 ...

  7. Python不是大蟒蛇,是个 BBC 电视剧?编程语言都是如何命名的?

    打开世界编程语言排行榜,出现在榜单上的语言名称多半都让人一头雾水.一些编程语言的作者会以「这种语言是什么」来命名语言,比如 BASIC.COBOL.TCL.LISP:另一些语言则是由它从哪些现有语言派 ...

  8. 当Java、C++、Python等编程语言都变成软妹子

    试想一下,当Java.C++.Python.Ruby.PHP.C#.JS等编程语言变成了动漫人物会是怎样的一幅场景呢?下面就一起看看在日本作家渡辺将人的笔下,各种编程语言都是哪类"美女&qu ...

  9. 当编程语言都变成女孩子 猿哥想想都觉得冲动

    试想一下,当Java.C++.Python.Ruby.PHP.C#.JS等编程语言变成了动漫人物会是怎样的一幅场景呢?下面就一起看看在日本作家渡辺将人的笔下,各种编程语言都是哪类"美女&qu ...

  10. 为什么很多大学生甚至研究生抛弃专业去做码农呢?

    作者:Marisa Hakurei 广州市对2017年全市劳动者工资统计中,互联网制造业从业者与化工类制造业从业者的工资对比如下: 绘制成图表,更加明显: 看到了吗,什么叫做差距?这就叫差距. 图中蓝 ...

最新文章

  1. 让Redis在你的系统中发挥更大作用的几点建议
  2. 内存溢出之Tomcat内存配置
  3. python numpy矩阵切片和索引的用法(冒号:和省略号...)
  4. Lazarus安装使用
  5. css 实现标签切换,CSS_纯CSS实现Tab切换标签效果代码,本文实例讲述了纯CSS实现Tab切 - phpStudy...
  6. Android 动态权限申请 BaseActivity 封装 拨打电话
  7. SSD6中Exercise4 (substitute.cpp) 答案解析
  8. react实现浏览器自动刷新_react调用什么刷新页面
  9. 奥鹏2019计算机应用基础1,奥鹏东师2019年秋季(计算机应用基础)离线考核(仅供参考).docx...
  10. proj4经纬度bl转换xy_分享proj4js中经纬度和兰伯特投影的转换代码
  11. 状态压缩dp学习小记part1
  12. 【PHP】百度贴吧自动/云签到脚本(PC 端)
  13. Ruby on Rails 中你使用了Kaminari 后,千万不要再引入will_pagination 这个Gem 了
  14. 用matplotlib可视化加州房价价格(散点图各个参数的含义)
  15. GET 请求能传图片吗?
  16. 沁恒CH32F103C8T6(一): Keil5环境配置,示例运行和烧录
  17. 运行在命令行的微信 cmd-wechat-terminal
  18. 发票查验小工具的开发
  19. Android源代码编译原理与前期准备
  20. 计算机专业可以当剪辑师,什么人可以做剪辑师?

热门文章

  1. ICGC:国际肿瘤基因组协会简介
  2. QCon-小布助手对话系统工程实践
  3. 美国市场数据分析初创公司Simon Data获2000万美元融资
  4. 体育赛事系统设计方案
  5. Crime HDU - 4623(状压DP,不同进制转换)
  6. HDOJ 4622 Reincarnation (hash)
  7. 《秘密》BY东野圭吾
  8. C# 经纬度格式化输入控件的简单实现(附html、Qt实现)
  9. 【NRF51822】DFU过程梳理
  10. matlab画贝塞尔曲线给出图题,matlab练习程序(贝塞尔曲线)