【问题标题】:Function parameters without types in C programming languageC语言中没有类型的函数参数
【发布时间】:2016-11-27 01:01:58
【问题描述】:

让我们考虑以下程序:

#include<stdio.h>

int test(a,b,c)
{
    return a+b+c;
}

int main()
{
    printf("%d\n",test(1,2,3));
    printf("%d\n",test(1.5,2.2,2.3));
}

我不知道可以在 C 中指定函数而不定义其参数的类型。这是 ANSI C 的一个特性?谁可以给我解释一下这个?

我认为这是不可能的。但是,我的编译器可以编译这个程序!在哪些情况下我可以这样做?

另外,程序的行为有点奇怪。当我使用整数值时,函数会执行我们期望的操作。但是,当我使用浮点参数时,结果与我的预期大不相同。

【问题讨论】:

  • 那不是有效的 C!
  • 好的。是我想的。但是,我的编译器 (mingW) 编译它没有我们的问题。为什么?
  • 那些'float'参数都是double类型;你必须写1.5F 才能使它们成为float 类型。当一个函数没有原型时,因为没有test(),那么所有参数都会进行默认提升——小于int的整数类型转换为intfloat值转换为double .现在使用 K&R 风格的函数定义是一个非常糟糕的主意,但 C11 标准仍然允许它们。你永远不应该自己写一个;你应该致力于升级你在你工作的代码中找到的任何东西。

标签: c function parameters


【解决方案1】:

如果您使用GCC 编译此代码,它将显示类似type of 'a' defaults to ‘int’ 的警告,因为C 在未指定时隐式假定参数类型为int

添加了不必在函数中指定参数类型的功能,以提供与该语言的旧版本(该语言的K&amp;R 版本)的向后兼容性。当GCC 遇到"old style" 函数时,它符合旧的K&amp;R C behaviour,这意味着在这种情况下没有警告。

您得到未定义结果的一个可能原因可能是因为调用代码不知道它需要将参数转换为int,因此改为传递float。然后你的函数test 要么读取floats 未被复制到的寄存器/堆栈位置,要么接收float 参数的bit 表示并将它们视为int。这些will 中的任何一个都会导致收到不正确的a, b, c 值。

请注意,如果您明确指定参数的类型,例如int test(int a, int b, int c),那么它将对floats 进行类型转换,然后将它们传递给函数,并输出5

【讨论】:

  • 我不知道 C 在未指定时隐式假定参数类型为 int !!!我用 C 写代码已经 10 年了,但我不知道!
  • 是的,它存在。另请参阅此链接:stackoverflow.com/questions/13950642/… 并将答案标记为已接受,如果它解决了您的问题:) @Zaratruta
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多