在JDK8u的jdk项目下做个很粗略的搜索:

mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for (s?;s?;" . | wc -l     369mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "while (true" . | wc -l     323

并没有差多少。

其次,for (;;) 在Java中的来源。个人看法是喜欢用这种写法的人,追根溯源是受到C语言里的写法的影响。这些人不一定是自己以前写C习惯了这样写,而可能是间接受以前写C的老师、前辈的影响而习惯这样写的。

在C语言里,如果不include某些头文件或者自己声明的话,是没有内建的Bool / bool类型,也没有TRUE / FALSE / true / false这些Bool / bool类型值的字面量的。所以,假定没有include那些头文件或者自己define出上述字面量,一个不把循环条件写在while (...)括号里的while语句,最常见的是这样:

  while (1) {    /* ... */  }

但不是所有人都喜欢看到那个魔数“1”的。而用for (;;)来表达不写循环条件(也就是循环体内不用break或goto就会是无限循环)则非常直观,这就是for语句本身的功能,而且不需要写任何魔数。

所以,这个写法就流传下来了。

顺带一提,在Java里我是倾向于写while (true)的,不过我也不介意别人在他们自己的项目里写for (;;)。

至于Java里的for (;;)与while (true),哪个更快?

这种规范没有规定的问题,答案都是“看实现”,毕竟实现只要保证语义符合规范就行了,而效率并不在规范管得着的范畴内。以Oracle/Sun JDK8u / OpenJDK8u的实现来看,首先看javac对下面俩语句的编译结果:

public void foo() {    int i = 0;    while (true) { i++; }  }/*  public void foo();    Code:      stack=1, locals=2, args_size=1         0: iconst_0         1: istore_1         2: iinc          1, 1         5: goto          2*/

public void bar() {    int i = 0;    for (;;) { i++; }  }/*  public void bar();    Code:      stack=1, locals=2, args_size=1         0: iconst_0         1: istore_1         2: iinc          1, 1         5: goto          2*/

连javac这种几乎什么优化都不做(只做了Java语言规范规定一定要做的常量折叠,和非常少量别的优化)的编译器,对上面俩版本的代码都生成了一样的字节码。

后面到解释执行、JIT编译之类的就不用说了,输入都一样,输出也不会不同。

来源:zhihu.com/question/52311366/answer/130090347

最后

刚整理 2020 年全套最新精品技术资料免费发给你! (原价最少8999元,超2000G!)

领取 看看下面!!

1、点赞 + 评论 (勾选 “转发” )

2、关注小编私信。点击头像,关注。并私信回复关键词: 1024

getdevicecaps在哪个头文件里_一招定胜负,while (true) 和 for (;;) 到底哪个更快相关推荐

  1. makefile指定头文件路径_玩转Makefile | 企业项目Makefile实例

    我是良许,世界500强外企 Linux 工程师,专业生产 Linux 干货,欢迎关注我的知乎「良许Linux」,欢迎点赞,收藏! 1. 前言 本教程展示了一个比较完整的企业项目级别的Makefile文 ...

  2. 头文件里应该写些什么

    1.输入输出接口函数声明如extern void InitLcd1602(); 2.全局变量声明 3.声明自定义数据类型:结构体,枚举体 typedef signed char int8; main. ...

  3. c语言u8代表,请问头文件里的 u8,u16 vu 等符号是什么意思?

    琢磨了几个头文件,懂了..stm32f10x_type.h这个头文件类有定义,这是一个开发板的例程中的代码,这是arm的默认头文件还是这个开发板的技术员写的. /******************* ...

  4. C++实践小经验——#include 何时放在头文件里,何时放在cpp文件里?

    结合我自己的经验,谈一谈模块化编程时#include应该出现的位置.总结起来大体有二条规则: 一.规则1:只包含必要的头文件 看下面这个模块: ===foo.c==== #include <st ...

  5. 单片机sleep函数的头文件_c语言的 sleep函数到底在哪个头文件里啊

    展开全部 在里面. 在VC中使用时,sleep函数的头文件为windows.h,在Linux下,gcc编译器中,使用的头文件因gcc版本62616964757a686964616fe59b9ee7ad ...

  6. tcount在哪个文件里_办公软件技巧:一键获取文件名称

    今日头牌 | 小黑Music | <着迷>来源 | 小黑资源宝(ID:maoshixiaohei)这是小黑号 始发于 2016.6.7 最近在工作中需要处理大量的文件,量大到头秃了. 怎么 ...

  7. c语言ord函数在哪个头文件里,第五章 文件的输入和输出

    作者:村里有个男孩叫小方 1 实验目的 掌握python 操作文件的内建函数(open read write close) 2 实验目标 完成对数据的分类(有一段json数据包的.txt数据,里面有电 ...

  8. linux uint32t 头文件,STM32 uint32_t 在哪个头文件里

    匿名用户 1级 2011-04-20 回答 stm32f10x_type.h这个文件里面:你也可e799bee5baa6e4b893e5b19e31333264633561以自己设置:我就是这样设置的 ...

  9. java action的头文件注释_有没有java大神,帮我详细注释下面的代码,action里面复制来的...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 public String gzaddbefore() { Yg bean = dao.findById(id); System.out.println( ...

最新文章

  1. Delphi 与 DirectX 之 DelphiX(77): TDIB.Distort();
  2. c/c++ max/min 4种实现方法
  3. mysql ssd inodb___细看InnoDB数据落盘 图解 MYSQL
  4. java 广播地址,根据ip地址跟子网掩码获取广播地址的java实现
  5. python中的常量_Python中的变量和常量
  6. thinkphp导航高亮的方法
  7. Asp.net通过Gmail发送邮件
  8. python从键盘获取数学表达式字符串_python – 数学表达式中String类型的字符串操作...
  9. jieba分词相关、join合并列表元素
  10. SqlServer递归查询树形结果数据
  11. python中模块下载方法(conda+pip)
  12. FAT32文件系统结构详解
  13. c语言整形符号位_c语言无符号整型表示
  14. MIT-OS实验-lab1
  15. 计算机视觉 常用坐标系一览
  16. 如何把excel中的一行复制成多行
  17. 京东JOS API 接入使用笔记
  18. 别让房子升值迷惑,特别是公寓
  19. python远程使用ants中的配准命令和N4biasfiledcorrection注意点
  20. python无法安装tensorflow_Windows上安装Tensorflow踩的坑

热门文章

  1. android 5.0.1 libdvm.so,Android逆向进阶—— 脱壳的奥义(基ART模式下的dump)
  2. centos7 安装redis_Redis6安装(上) - 单机单实例
  3. 【转】C#数据结构-有限状态机
  4. ABP入门系列(19)——使用领域事件
  5. 51单片机auxr寄存器_51—52系列单片机特殊功能寄存器一览表
  6. ES:记录curator+nfs进行索引备份、创建快照的一次实践
  7. 爬取网易云音乐歌曲特色榜单信息
  8. PWN-PRACTICE-CTFSHOW-5
  9. 【HDU - 3870】Catch the Theves(平面图转对偶图最短路,网络流最小割)
  10. *【CodeForces - 1150D】Three Religions(dp,预处理,思维)