如果我有这样的for循环:
for(int i = 0; i < getInt(); i++){//code}
每次for循环检查是否会执行getInt():
i < getInt();
或者它会在最开始执行一次并返回一个值j,以便for循环可以检查是否:
i < j;
我想知道的特定语言是Java,但如果答案在其他语言中有所不同,我也想知道。
答案 0 :(得分:6)
是的,它将在每个循环中执行。
基本上,执行是这样的:
for
条件的第一部分执行一次true
,则评估第二部分。否则,请转到循环后的语句。i++
此处)2.
第二部分(延续条件)每次都不能被完全评估是没有意义的。如果循环体中的某些内容导致getInt()
在迭代之间返回不同的值,该怎么办?
当然,编译器可以自由地执行常量表达式的优化以及它可以证明的其他一些事情。例如,如果getInt()
被定义为:
public int getInt() {
return 4;
}
你的编译器可以
for(int i = 0; i < 4; i++) { //body }
在某些情况下getInt()
实际上会被调用,在其他情况下它不会被调用。在所有情况下,您的编译器都是正确的,因为它只会执行转换,导致代码的行为完全如同 - 如果不执行转换。