我想知道编写循环的最佳方法是哪种?
Count Down_to_Zero循环优于Count_Up_Loops吗?特别是在嵌入式系统环境中哪一个更好选择???
答案 0 :(得分:9)
在嵌入式世界中,最好使用一种方案而不是另一种方案,这取决于您使用的处理器。例如,PIC处理器具有“递减并且如果不为零则跳转”的指令。这对于在单个指令中执行倒计数“for”循环非常有用。
其他处理器具有不同的指令集,因此适用不同的规则。
您可能还需要考虑编译器优化的影响,这可能会将计数转换为可能更有效的倒计时版本。
与往常一样,如果您不得不担心这些事情,那么您使用的是错误的处理器和工具。使用比汇编程序更高级语言编写的想法是向维护工程师解释软件的工作原理。如果使用倒计时循环是反直觉的,那么不管处理器效率的(次要)损失如何。
答案 1 :(得分:3)
这是个人喜好。对于数组,从0开始计数通常更好,因为您通常希望按顺序处理每个值。这两种风格本身都不是更好,但它们可能会有不同的结果(例如,如果您在数组中打印每个值,则输出的顺序会有所不同)。
在许多情况下(除了数组之外),最合理的选择是使用while
循环而不是for
循环,例如从文件中读取:
int c;
while ((c = fgetc(somefile)) != EOF)
/* Do something */
答案 2 :(得分:3)
主要担心的是,您或其他人将来会在某个时间阅读代码,并且必须能够理解代码的目的。
换句话说,用纯文本编写代码。如果你打算做十次,那么从0循环到小于10。如果你打算在数组中向后走,则从较高的值循环到较低的值。
避免在for
语句的标题中放置与循环控制无关的任何内容。
在效率方面,您可以放心地将其留给编译器。
答案 3 :(得分:2)
编写for循环的最佳方法是:
for(i=0; i<N; i++)
for(j=0; j<N; j++)
{
array[i][j] = ... ;
}
其他一切都是“过早优化”,即编译器真正能够为您处理的事情。
但是,如果你有一个哑编译器,从N下降到零可能更有效,因为与零比较比在大多数CPU上与值进行比较要快。
请注意,如果可能,N应该是常量表达式。从循环比较中省略像strlen()等函数调用。
如果代码可能最终出现在C ++编译器中,那么我也会更快,其中C ++标准保证++ i比i ++更快,因为i ++创建了一个临时的不可见变量。对于大多数系统,循环的顺序应如上所述,因为这通常是解决高速缓存存储器的最有效方法,这是一个非常高级的主题。