Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# for循环参数是否执行每个迭代?_C#_Performance_For Loop_Parameters_Reverse - Fatal编程技术网

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更好。回答得很好,谢谢!没问题-很高兴能帮上忙!另外,非常感谢您接受我的回答!:)