while(true) 和 for(;;) 比较

引子

今天在论坛中闲逛,看见一貌似很简单的问题

while(true)和forfor( ; ; )有区别吗,为什么C库源码中的都是for( ; ; )而不是while(true)

确实很简单的问题,可我确实不清楚,特此在网上查了一下 ,但是发现网上说法众说纷纭,经过查找资料,答案如下:

先抛答案

1、在C编译器中确实有区别,较之while( true ),for( ; ; ) 的效率更高一些
2、在java编译器中没有大的区别,看个人喜好和习惯而已

验证

C/C++

有如下代码:

int main()
{
	int i;
	i = 0;
	for (;;)
	{
		i++;
	}

	i = 0;
	while (true)
	{
		i++;
	}

	return 0;
}

在这里插入图片描述
如上图所示,左边是for( ; ; )的反汇编结果,右边是while(true)的反汇编结果,两者进行比较,会发现:while(true)比for( ; ; )多了几步操作,先将括号中的结果给寄存器,然后寄存进行比较,若比较结果为0则跳转到循环的结束执行其他操作

Java

同样的,对下面两段代码进行编译,得到的编译结果如注释所示:

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
*/

此时,会发现,编译器对这两个死循环的处理方式没有任何的不同,此时,就可以认为Java中while(true) 和 for( ; ; )是没有区别的


才疏学浅,若有不足之处,请您指正…

THE END

发布了68 篇原创文章 · 获赞 15 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43746320/article/details/104004688