C、当调用函数的参数不满足被调用函数的参数需要时

标签 c stack

我正在学习C。我在学习一些章节的时候做了一些小实验。

主要问题是我不明白为什么代码的执行结果如下,因为它不符合我认为代码会去的地方。

源代码:

#include <stdio.h>

int imax();

int main(void)
{ 
    printf("%zd %zd\n", sizeof(int), sizeof(double));
    printf("The maximum of %d and %d is %d.\n", 3, 5, imax(3));
    printf("The maximum of %d and %d is %d.\n", 3, 5, imax(3.0, 1000.0));
    printf("The maximum of %d and %d is %d.\n", 3, 5, imax(3.0));
    printf("The maximum of %d and %d is %d.\n", 3, 5, imax(1000.0));

    return 0;
}

int imax(n, m)
int n, m;
{
    return (n > m ? n: m);
}

输出:

enter image description here

我不明白的是为什么最后三个打印语句打印相同的词! 我知道我正在做一个测试来研究当使用不关心形式参数类型的旧样式声明函数时会发生什么。 在此背景下,我设计了四种调用函数实参与被调用函数形参要求不匹配的情况。

我知道这与 C 中的堆栈机制有关。我尽力寻找原因。在我看来,最后三个打印语句的行为应该有所不同。事实上,我认为语句 imax(3.0, 1000.0) 可能与 imax(3.0) 或 imax(1000.0) 相同,但不可能与两者相同!

最佳答案

int imax();

int imax(n, m)
int n, m;
{
    return (n > m ? n: m);
}

是一种古老的 C 代码风格。不要使用它,因为它的问题之一是它不进行任何函数参数检查。

正确的标准化代码应该是

int imax( int n, int m)

int imax( int n, int m)
{
    return (n > m ? n: m);
}

关于C、当调用函数的参数不满足被调用函数的参数需要时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49792706/

相关文章:

c - 将已弃用的 "dev_attrs"属性替换为 "dev_groups"

c - 如果将 NULL 和大小 0 传递给 realloc() 会怎样?

C: 'unlink' 未在此范围内声明

c# - C# 中的油漆桶函数代码,运行时挂起,

c - 使用 GCC + ARM 减少递归期间的堆栈使用

c - 数组访问 args[0][1] -'0'

c - 在 OpenGL 中实现旋转的推荐方法

java - 如何使用 <T extends Comparable<T>> 实现 Stack<E> ?

c++ - 如何防止在堆上创建对象?

java - 在 javaFX 中使 Stage 静态。这是不是一个好主意?