C# for循环参数是否执行每个迭代?
在某一点上,我想随机化一个数组是否会在创建时反转 我首先想到的是:C# for循环参数是否执行每个迭代?,c#,performance,for-loop,parameters,reverse,C#,Performance,For Loop,Parameters,Reverse,在某一点上,我想随机化一个数组是否会在创建时反转 我首先想到的是: bool reverse = Random.value > 0.5f; for ( int i = reverse ? steps - 1 : 0; reverse ? i >= 0 : i < steps; i += reverse ? -1 : +1 ) { rotateScript.angles.Add(angleRange[0] + s
bool reverse = Random.value > 0.5f;
for (
int i = reverse ? steps - 1 : 0;
reverse ? i >= 0 : i < steps;
i += reverse ? -1 : +1
) {
rotateScript.angles.Add(angleRange[0] + stepAdder * i);
}
bool reverse=Random.value>0.5f;
为了(
int i=反向?步骤-1:0;
反向?i>=0:i<步数;
i+=反向?-1:+1
) {
rotateScript.angles.Add(角度范围[0]+步进加法器*i);
}
后来我意识到,尽管使用了更多的行,但if/else中的两个for循环更具可读性
但问题仍然存在:这些三元条件是在每次迭代中执行,还是只执行一次?正确,在每次迭代中对
for
语句的第二和第三个组件进行评估
这:
相当于:
x;
while( y ) { a; z; }
因此,对
y
的求值时间将比z
正确,在每次迭代中对for
语句的第2和第3部分求值
这:
相当于:
x;
while( y ) { a; z; }
因此,y
将比z
多计算1次,正如@Dai所指出的,第二个和第三个语句必须在每次迭代结束时进行计算
这种行为在C#语言规范的第1部分中有详细说明。转述一下,它说的是一个
for ( initialiser; condition; iterator; ) { ... }
声明:
for语句的执行如下:
- 如果存在for初始值设定项,则变量初始值设定项或语句表达式将按写入顺序执行。此步骤仅执行一次
- 如果存在for条件,则对其进行评估
- 如果for条件不存在或计算结果为true,则控制权将转移到嵌入语句。当且如果控件到达嵌入语句的端点,则按顺序计算for迭代器的表达式,然后执行另一次迭代,从上面步骤中的for条件计算开始
- 如果for条件存在且计算结果为false,则控制权将转移到for语句的端点
用你的代码
for (
int i = reverse ? steps - 1 : 0;
reverse ? i >= 0 : i < steps;
i += reverse ? -1 : +1
) {
rotateScript.angles.Add(angleRange[0] + stepAdder * i);
}
选项2:将三元逻辑移出:
首先计算极限和增量,即
我更喜欢选项1,因为我认为大多数人认为对于
循环,直接的更容易理解。正如@Dai所指出的,第二和第三个语句必须在每次迭代结束时进行评估
这种行为在C#语言规范的第1部分中有详细说明。转述一下,它说的是一个
for ( initialiser; condition; iterator; ) { ... }
声明:
for语句的执行如下:
- 如果存在for初始值设定项,则变量初始值设定项或语句表达式将按写入顺序执行。此步骤仅执行一次
- 如果存在for条件,则对其进行评估
- 如果for条件不存在或计算结果为true,则控制权将转移到嵌入语句。当且如果控件到达嵌入语句的端点,则按顺序计算for迭代器的表达式,然后执行另一次迭代,从上面步骤中的for条件计算开始
- 如果for条件存在且计算结果为false,则控制权将转移到for语句的端点
用你的代码
for (
int i = reverse ? steps - 1 : 0;
reverse ? i >= 0 : i < steps;
i += reverse ? -1 : +1
) {
rotateScript.angles.Add(angleRange[0] + stepAdder * i);
}
选项2:将三元逻辑移出:
首先计算极限和增量,即
我更喜欢选项1,因为我想大多数人都觉得直接的循环更容易理解。谢谢。我原以为编译器可能会在参数内做一些工作,但现在我发现它不能,因为我可能会在循环范围内更改“反向”布尔值。谢谢。我原以为编译器可能会在参数内做一些工作,但现在我发现它不可能,因为我显然可以在循环范围内更改“反向”布尔值。我确实喜欢选项1,比使用两个循环的if/else更好。回答得很好,谢谢!没问题-很高兴能帮上忙!另外,非常感谢您接受我的回答!:)我确实喜欢选项1,比使用两个循环的if/else更好。回答得很好,谢谢!没问题-很高兴能帮上忙!另外,非常感谢您接受我的回答!:)