C函数变量改变

标签 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

你能解释一下为什么吗?

最佳答案

这是 C 中未定义的行为。它可能会根据执行或许多其他因素而变化。 函数参数的计算顺序未指定。你永远无法用任何标准规则来解释你所看到的行为。当你在老师面前在不同的机器上运行它时,它会给出不同的结果。

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

standard 6.5.2.2p12 中对此有明确的示例

In the function call

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

the functions f1, f2, f3, and f4 may be called in any order. All side effects have to be completed before the function pointed to by pf[f1()] is called.

传递参数时的方式相同 - 它们的评估顺序可能会有所不同。您的 printf 示例也是另一个这样的示例。

检查您从中了解这一点的幻灯片 - 必须是一张幻灯片未定义的行为

关于C函数变量改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48241112/

相关文章:

c - 如果不在字符串末尾使用\0,在 C 语言中会发生什么情况?

c - 将开罗与 gtk3 一起使用

function - Powershell - 如何构建一个函数来用其他字符替换某些特殊字符

c++ - 我们是否必须为断言或异常编写单元测试?

function - 连接路径和文件

javascript - 如果一个变量是根据另一个定义的,它能反射(reflect)另一个绑定(bind)的变化吗?

ruby-on-rails - 局部变量、实例变量、全局变量和类变量有什么区别?

c++ - 不同的函数指针语法作为另一个函数的参数

python - 函数参数名以下划线开头

c - 如何从用户那里获取包含由空格分隔的字符串和整数的输入?