我运行了以下代码,发现了一些奇怪的输出。
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/