评估订单确实很重要,因此,这是否称为非参照透明度?
int i = 1;
int counter(){
i = i + 1;
return i;
}
int foo(int i, int j){
return i*2 + 3*j;
}
int main(){
printf("%d", foo(counter(), counter()));
}
Run Code Online (Sandbox Code Playgroud)
Pét*_*rök 10
我想你可能会想到的是,函数参数的评估顺序在C中没有标准化.因为counter()每次调用都会返回不同的结果,并且结果与之foo(2, 3)不同foo(3, 2),编译和执行此代码可能会给你不同平台上的不同结果.
然而,在同一平台上,它是确定性的,正如其他人所解释的那样.[更新](准确地说:一旦在具有特定编译器选项的特定平台上编译成可执行文件,所有执行都将产生相同的输出.但是,正如评论者指出的那样,它甚至可能在构建时在同一平台上产生不同的输出不同的编译选项.)[/ Update]
严格来说,即使使用相同的编译器和设置在同一平台上编译,有问题的代码也可能会产生不同的结果.未指定评估函数参数的顺序.C标准将"未指定的行为"定义为
使用未指明的值,或本国际标准提供两种或更多种可能性的其他行为,并且在任何情况下都没有选择其他要求(C99§3.4.4/ 1).
重要的是"在任何情况下"实现可能会做一些不同的事情,因此,例如,您的编译器可以发出代码,随机选择评估参数的顺序.
显然,在同一程序的不同运行期间,任何实现都不太可能以不同方式评估函数的参数.
关键是你不应该依赖于评估函数参数的顺序; 在一个正确的程序中,它应该没关系.
| 归档时间: |
|
| 查看次数: |
604 次 |
| 最近记录: |