C函数变量改变

时间:2018-01-13 15:03:35

标签: c function variables

我有学习函数调用的基本代码。但我对此代码中的内容并不了解。当我与我的答案和预期输出相比时,我感到困惑。  我的代码如下:

#include <stdio.h>

void f(int a, int b, double c){
    printf("%d \n", a);printf("%d \n", b);printf("%f \n", c);
}

int main(void){
  int i = 0, x = 7;
  float a = 2.25;

  f (x=5, x-7, a);
  printf("\n\n");

  f (x = 6, x-7, a);
  printf("\n\n");

  printf("%d %d\n",i, i++ );
  printf("%d %d\n",i, ++i );
  return 0;
}

在最后2个printf语句中,我的答案如下:

0 0
1 1

但输出为:

1 0
2 2

你能解释一下原因吗?

2 个答案:

答案 0 :(得分:1)

它是C中未定义的行为。它可能因执行或许多其他事情而有所不同。 函数参数的评估顺序未指定。您永远无法解释任何标准规则所看到的行为。当你在另一台机器上的老师面前运行时会产生不同的结果。

最好编写代码,以避免所有这些歧义。

来自standard 6.5.2.2p12

的明确示例
  

在函数调用中

      (*pf[f1()]) (f2(), f3() + f4())
     

可以按任何顺序调用函数f1f2f3f4 。所有副作用都必须如此   在调用pf [f1()]指向的函数之前完成。

当您传递参数时,它们的评估顺序可能会有所不同。你的printf示例也是另一个例子。

检查您需要了解的幻灯片 - 必须是幻灯片 未定义的行为

答案 1 :(得分:0)

  

你能解释一下原因吗?

因为编译器从右到左计算了参数。它允许以任何一种方式执行,并最终生成了代码,就像那样做。你知道,它并不想像Buridan的驴一样死去; - )

你可能会说C编译器没有自由意志。是的,他们不是,但生成的代码依赖于许多不同的东西,例如编译器品牌,版本,命令行选项等。在这种特殊情况下,C标准对C编译器没有任何限制。所以它正式被称为&#34;未定义的行为&#34;。永远不要这样做。