当前位置:  开发笔记 > 编程语言 > 正文

C for循环的实现方式与其他语言不同?

如何解决《Cfor循环的实现方式与其他语言不同?》经验,为你挑选了2个好方法。

我在回顾Knuth的"计算机编程艺术"时阅读了以下内容:

"非常'实用性'意味着想成为CS的专业人员必须学习Kernighan在设计C时的错误,特别是一个臭名昭着的事实,即for循环反复评估for条件,这与大多数其他语言的行为重复并且无法匹配它实现了for循环."

(http://www.amazon.com/review/R9OVJAJQCP78N/ref=cm_cr_pr_viewpnt#R9OVJAJQCP78N)

这家伙在说什么?你怎么能实现一个for循环不仅仅是一个while循环的语法糖?



1> Magnus Hoff..:

考虑一下:

for i:=0 to 100 do { ... }

在这种情况下,我们可以通过函数调用替换最终值100:

for i:=0 to final_value() do { ... }

......而且final_value-function只会调用一次.

但是在C中:

for (int i=0; i

... final_value通过循环每次迭代都会调用-function,因此更加冗长是一种很好的做法:

int end = final_value();
for (int i=0; i


对于这个例子,我假设你实际上只想调用一次final_value.在C中表达这很麻烦.很可能你每次都想调用final_value,但我经常发现我只想调用一次.

2> codebunny..:

如果你想要的只是一个简单的计数循环,那么

for (i=0; i<100; i++) dostuff();

没问题,编译器可以优化它.

如果在for语句的continue部分使用函数,比如

for (i=0; i

然后每次都会对函数进行评估,这通常不是一个好主意,因为函数开销会减慢你的进程.有时它会使您的过程变慢到无法使用的程度.

如果函数的返回值在迭代期间不会改变,则从循环中提取它:

slen = strlen(s);
for (i=0; i

但是有时候函数会在每次调用时返回不同的值,然后你不希望它从循环中提取出来:

for (isread(fd, &buffer, ISFIRST);
     isstat(fd) >= 0;
     isread(fd, &buffer, ISNEXT)
{
  dostuff(buffer);
}

并且您希望每次都进行评估.(这是一个基于我所做工作的略有做法的例子,但它显示了潜力).

C为您提供了以任何方式滚动循环的原始能力.你必须知道你的循环应该如何工作,并根据你的需要尽可能地优化它.

最后一个例子可以表示为while循环:

isread(fd, &buffer, ISFIRST);
while (isstat(fd) >= 0)
{
  dostuff(buffer);
  isread(fd, &buffer, ISNEXT);
}

但它不是那么整洁,如果我在循环中使用continue,那么我必须再次调用迭代的isread.将整个事物放在for循环中使它更整洁,并确保迭代isread被称为每个循环.

我编写了较低级的函数,因此它们可以用于这样的循环.它将while循环的所有元素组合在一起,以便您可以更轻松地理解它.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有