非变量函数如何接受不同数量的参数(与定义的参数不同)? #包括 int foo(); int-bar(); 内部主(空) { foo(2,3,4); 返回0; } int foo(int a,int b) { 返回杆(a); } 整型条(整型c,整型d) { int e=c+d; printf(“%d”,e); 返回e; }

非变量函数如何接受不同数量的参数(与定义的参数不同)? #包括 int foo(); int-bar(); 内部主(空) { foo(2,3,4); 返回0; } int foo(int a,int b) { 返回杆(a); } 整型条(整型c,整型d) { int e=c+d; printf(“%d”,e); 返回e; },c,function,C,Function,输出 五, 为什么bar()函数可以接收两个参数?一个函数声明,用一个空括号作为参数列表的意思是,函数可以接收的参数的数量和类型没有限制(和检查)。可以使用任意数量和类型的参数调用它 FWIW,如果要指定一个不带参数的函数,需要指定void作为参数列表,如 #include<stdio.h> int foo(); int bar(); int main(void) { foo(2,3,4); return 0; } int foo(int a, int b) { r

输出

五,


为什么
bar()
函数可以接收两个参数?

一个函数声明,用一个空括号作为参数列表的意思是,函数可以接收的参数的数量和类型没有限制(和检查)。可以使用任意数量和类型的参数调用它

FWIW,如果要指定一个不带参数的函数,需要指定
void
作为参数列表,如

#include<stdio.h>

int foo();
int bar();

int main(void)
{
  foo(2,3,4);
  return 0;
}

int foo(int a, int b)
{
  return bar(a);
}

int bar(int c, int d)
{
  int e = c + d;
  printf("%d",e);
  return e;
}
引用第§6.5.2.2章“函数调用”中的
C11

。。。如果参数的数量不等于参数的数量,则 行为未定义


因此,您的程序调用。绝对不能保证或预测应用程序将如何运行。

根据C标准(6.5.2.2函数调用)

  • 如果表示被调用函数的表达式的类型 不包括原型,整数升级在 每个参数和具有float类型的参数都升级为 双重的这些被称为默认参数如果 参数的数量不等于参数的数量 行为未定义。
  • 因此,您的程序具有未定义的行为

    如果在函数调用之前指定了函数原型,例如

     int foo(void);
    

    那么编译器就有可能报告错误,而不编译和链接您的程序。

    intbar(intc,intd)
    c
    d
    的值是多少,如果它被称为
    bar(a)
    。如果我使用
    intfoo(inta,intb)
    @RakholiyaJenish,它是否能够访问函数
    foo
    中的
    4
    :当您错误调用函数时,
    c
    d
    没有指定值。您没有指定函数原型,因此放弃了它们提供的检查。您正在调用未定义的行为;您可以得到编译器认为合适的任何结果。它不必告诉你这是什么,也不必前后一致,它可以重新格式化你的磁盘驱动器,而不是打印一个半真半假的数字,你没有理由抱怨——你调用了未定义的行为。谢谢@JonathanLeffler和SouravGhosh,我现在明白了。请正确缩进你的代码。避免使用标签。在编辑框中输入应该显示的代码,然后选择它并使用编辑框上方的
    {}
    按钮缩进它,使其显示为代码。还请注意,最好以换行符结束打印语句。你的代码中有很多未定义的行为,但是编译器帮不了你,因为尽管你声明了函数
    foo()
    bar()
    ,但你没有指定函数原型。我个人认为没有理由对这个问题投反对票,这是一个真正的问题,许多初学者面临同样的问题,并感到困惑。虽然这可能是一个愚蠢的问题,但问题的质量是好的,但至少,它是以适当的方式提出的。:-)
    //..
    int foo(int a, int b);
    int bar(int c, int d);
    
    int main(void)
    {
      foo(2,3,4);
      return 0;
    }
    //...