c - K&R 和 ANSI 函数输出之间的区别

标签 c

我运行了以下代码,发现了一些奇怪的输出。


int
mean_ansi (int num1, int num2)
{
  printf ("In %s\n", __FUNCTION__);
  printf ("num1,num2 is %d,%d\n", num1, num2);
  return (num1 + num2) / 2;
}

int
mean_K_and_R (num1, num2)
     int num1, num2;
{
  printf ("In %s\n", __FUNCTION__);
  printf ("num1,num2 is %d,%d\n", num1, num2);
  return (num1 + num2) / 2;
}


int
main ()
{
  int i = 6;
  double f = 1.0;

  printf ("In %s\n", __FUNCTION__);
  printf ("[f,i] = [%f,%d]\n", f, i);

  /* deliberate mistakes */
  mean_ansi (f, i);
  mean_K_and_R (f, i);

  return 0;
}

输出:

主要

[f,i] = [1.000000,6]

在 mean_ansi

num1,num2 是 1,6

平均_K_and_R

num1,num2 是 0,1072693248

任何人都可以解释这种行为。

我看到了组装,但看不出太多。

在这两种语法中,将函数参数压入堆栈的方式是否存在差异?

最佳答案

Dan Olson 的想法是正确的,Slartibartfast 解释了值(value)观的来源:

mean_K_and_R() 的定义被视为是这样定义的

int mean_K_and_R();

即该函数接受任何参数,并且除了默认参数提升之外不进行任何转换。

如果使用 cdecl 调用约定,这意味着 mean_K_and_R(f, i) 将首先将 i 压入堆栈,然后是 f 的高位 然后是 f 的低位。

但该函数认为它采用了两个整数参数,这意味着 num1 现在将引用 f 的低位,而 num2 将引用更高位f 的位。

关于c - K&R 和 ANSI 函数输出之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/577081/

相关文章:

CMake C 编译器识别失败

c++ - 从 Writing Solid Code 调试内存包装代码,或可下载的 C/C++ 的类似替代品?

使用 Autoconf 为 ARM 交叉编译

c - 带有 SDL2 的 Makefile C

c - 在 __device/global__ CUDA 内核中动态分配内存

c - 如何在不先左移的情况下对两个数字进行“或”运算?

c - 如何在 C 中检查多个 continue 语句

C:混淆一个整数

c - 访问通过 execlp 传递的数组时出现问题

c - 如何将 lua_sethook 上下文与 lua_sethook 关联起来?