令人困惑的C代码,有人为我解释?

Rn2*_*2dy 3 c

评估订单确实很重要,因此,这是否称为非参照透明度?

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]

  • 潜在地,它可能在具有不同优化选项的相同平台中是不同的. (4认同)
  • 我不认为这里有确定性的语言保证,但如果编译器实现者将随机排序放入其中,我会非常惊讶.出于实际目的,它在给定平台上是确定性的. (2认同)

Jam*_*lis 7

严格来说,即使使用相同的编译器和设置在同一平台上编译,有问题的代码也可能会产生不同的结果.未指定评估函数参数的顺序.C标准将"未指定的行为"定义为

使用未指明的值,或本国际标准提供两种或更多种可能性的其他行为,并且在任何情况下都没有选择其他要求(C99§3.4.4/ 1).

重要的是"在任何情况下"实现可能会做一些不同的事情,因此,例如,您的编译器可以发出代码,随机选择评估参数的顺序.

显然,在同一程序的不同运行期间,任何实现都不太可能以不同方式评估函数的参数.

关键是你不应该依赖于评估函数参数的顺序; 在一个正确的程序中,它应该没关系.


agg*_*sol 6

它是确定性的,每次都会返回相同的值.

  • 程序结束后,全局变量的值不会保留. (2认同)