精华内容
下载资源
问答
  • 以下声明函数原型错误的是
    万次阅读
    2017-04-01 09:58:40

    一,函数原型

    函数原型(函数声明)就是告诉编译器这个函数是存在的,让编译器知道这个函数的相关信息。函数原型不要求提供形参名,有类型列表就可以了。避免使用函数原型的方法是,在首次使用函数定义之前定义它,但这并不是总可行的。我们一般把函数声明放在主函数的前面,因为min()函数是应用程序的入口。函数声明是告诉编译器这个函数存在,函数定义是表示该函数如何去做。


    二,为什么需要函数原型?

    函数原型描述了函数到编译器的接口,它将函数返回值的类型以及参数的类型和数量告诉编译器。例如:看函数原型如何影响下面的函数调用。

    double cube(double x);
    
    int main()
    {
        double val = cube(5.0);
        return 0;
    }
    
    double cube(double x){
        return x * x;
    }

    首先原型告诉编译器,cube()有一个double参数。如果程序没有提供这样的参数,原型将让编译器捕获这样的错误。其次,函数调用结束后,将把返回值放到指定的位置。然后调用函数将从这个位置获取返回值。由于函数原型指出了函数的返回值是double类型,因此编译器知道应检索多少个字节以及如何解释他们。如果没有这些信息,编译器只能进行猜测,但是编译器并不会这么做。


    三,函数原型的功能

    函数原型可以帮助编译器完成许多的工作,同时,它也可以帮助程序极大的降低程序出错的几率。原型可以确保以下几点:

    1,编译器正确处理函数返回值。

    2,编译器检索使用的参数数目是否正确。

    3,编译器检查使用的参数类型是否正确,如果不正确转换为正确的类型。

    int x = 5;
    double val = cube(x);

    首先看上面的函数调用,程序将一个int型的值5传递给cube()。编译器注意到,cube()原型指定一个double类型的参数,因此会将5转换为5.0。

    更多相关内容
  • 下面重载乘法运算符的函数原型声明中正确的是: 正确答案: A B D 你的答案: D (错误) MyClass operator *(double ,MyClass); MyClass operator *(MyClass ,MyClass); MyClass operator *...

    下面重载乘法运算符的函数原型声明中正确的是:

    正确答案: A B D   你的答案: D (错误)

    MyClass operator *(double ,MyClass);
    MyClass operator *(MyClass ,MyClass);
    MyClass operator *(double ,double);
    MyClass operator *(MyClass ,double);


    答案应该是ABD
    c++中规定,重载运算符必须和用户定义的自定义类型的对象一起使用。

    展开全文
  • 函数调用的一般形式 函数调用的一般形式为: ...按函数在语句中的作用来分,可以有以下3种函数调用方式: 函数语句 把函数调用单独作为一个语句,并不要求函数带回一个值,只是要求函数完成一定..

    函数调用的一般形式

    函数调用的一般形式为:
        函数名([实参表列]);
    如果是调用无参函数,则“实参表列”可以没有,但括号不能省略。如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应匹配(相同或赋值兼容)。实参与形参按顺序对应,一对一地传递数据。但应说明,如果实参表列包括多个实参,对实参求值的顺序并不是确定的。

    函数调用的方式

    按函数在语句中的作用来分,可以有以下3种函数调用方式:

    1. 函数语句
      把函数调用单独作为一个语句,并不要求函数带回一个值,只是要求函数完成一定的操作。如例4.1中的printstar( );
    2. 函数表达式
      函数出现在一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。如c=2*max(a, b);
    3. 函数参数
      函数调用作为一个函数的实参。如:
      m=max(a, max(b, c));  //max(b, c)是函数调用,其值作为外层max函数调用的一个实参

     

    对被调用函数的声明和函数原型

    在一个函数中调用另一个函数(即被调用函数)需要具备以下条件:

    1. 首先被调用的函数必须是已经存在的函数。
    2. 如果使用库函数,一般还应该在本文件开头用#include命令将有关头文件“包含”到本文件中来。
    3. 如果使用用户自己定义的函数,而该函数与调用它的函数(即主调函数)在同一个程序单位中,且位置在主调函数之后,则必须在调用此函数之前对被调用的函数作声明。


    所谓函数声明(declare),就是在函数尚在未定义的情况下,事先将该函数的有关信息通知编译系统,以便使编译能正常进行。

    【例4.3】对被调用的函数作声明。

     
    1. #include <iostream>
    2. using namespace std;
    3. int main( )
    4. {
    5. float add(float x,float y); //对add函数作声明
    6. float a,b,c;
    7. cout<<"please enter a,b:";
    8. cin>>a>>b;
    9. c=add(a,b);
    10. cout<<"sum="<<c<<endl;
    11. return 0;
    12. }
    13.  
    14. float add(float x,float y)//定义add函数
    15. {
    16. float z;
    17. z=x+y;
    18. return (z);
    19. }


    运行情况如下:
    please enter a, b: 123.68  456.45↙
    sum=580.13

    注意:对函数的定义和声明不是同一件事情。定义是指对函数功能的确立,包括指定函数名、函数类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。而声明的作用则是把函数的名字、函数类型以及形参的个数、类型和顺序(注意,不包括函数体)通知编译系统,以便在对包含函数调用的语句进行编译时,据此对其进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)。

    其实,在函数声明中也可以不写形参名,而只写形参的类型,如
        float add(float, float);

    这种函数声明称为函数原型(function prototype)。使用函数原型是C和C++的一个重要特点。它的作用主要是: 根据函数原型在程序编译阶段对调用函数的合法性进行全面检查。如果发现与函数原型不匹配的函数调用就报告编译出错。它属于语法错误。用户根据屏幕显示的出错信息很容易发现和纠正错误。

    函数原型的一般形式为:
        函数类型 函数名(参数类型1, 参数类型2…);

        函数类型 函数名(参数类型1  参数名1, 参数类型2  参数名2…);

    第(1)种形式是基本的形式。为了便于阅读程序,也允许在函数原型中加上参数名,就成了第(2)种形式。但编译系统并不检查参数名。因此参数名是什么都无所谓。上面程序中的声明也可以写成
        float add(float a, float b);  //参数名不用x、y,而用a、b
    效果完全相同。

    应当保证函数原型与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序必须相同。在函数调用时函数名、实参类型和实参个数应与函数原型一致。

    两点说明:
    1) 前面已说明,如果被调用函数的定义出现在主调函数之前,可以不必加以声明。因为编译系统已经事先知道了已定义的函数类型,会根据函数首部提供的信息对函数的调用作正确性检查。

    有经验的程序编制人员一般都把main函数写在最前面,这样对整个程序的结构和作用一目了然,统览全局,然后再具体了解各函数的细节。此外,用函数原型来声明函数,还能减少编写程序时可能出现的错误。由于函数声明的位置与函数调用语句的位置比较近,因此在写程序时便于就近参照函数原型来书写函数调用,不易出错。所以应养成对所有用到的函数作声明的习惯。这是保证程序正确性和可读性的重要环节。

    2) 函数声明的位置可以在调用函数所在的函数中,也可以在函数之外。如果函数声明放在函数的外部,在所有函数定义之前,则在各个主调函数中不必对所调用的函数再作声明。例如:
    char letter(char, char); //本行和以下两行函数声明在所有函数之前且在函数外部
    float f(float, float);  //因而作用域是整个文件
    int i(float,  float);
    int main( )
    {…}//在main函数中不必对它所调用的函数作声明
    char letter(char c1, char c2)  //定义letter函数
    {…}
    float f(float x, float y)//定义f函数
    {…}
    int i(float j, float k) //定义i函数
    {…}
    如果一个函数被多个函数所调用,用这种方法比较好,不必在每个主调函数中重复声明。

    展开全文
  • 这时一个ANSI C 编译器会假设您没有用函数原型声明函数,它就不会进行参数检查。 因此,为了表示一个函数确实不使用参数,需要在圆括号内加入void关键字: void printf_name(void); ANSI C 会把上句解释为...

    9.2.1 产生的问题

    下面我们讨论几个使用imax()函数的例子,该函数和imin()类似。在程序清单9.4中的程序以旧的形式声明函数imax(),然后错误的使用该函数。

    程序清单9.4 misuse.c程序

    /*misuse.c --不正确的使用函数*/
    #include <stdio.h>
    int imax();  /*旧式的函数声明*/
    int main(void)
    {
        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,5.0));
        return 0;
    }
    int imax(n,m)
    int n,m;
    {
        int max;
        if(n>m)
            max=n;
        else
            max=m;
        return max;
    }

    在第一个printf()中调用函数imax()时漏掉了一个参数,而在第二次调用imax()时使用了浮点参数而不是整数参数。尽管存在这些错误,该程序仍可以编译执行。

    程序运行时发生了什么?不同操作系统的内部机制不同,所以出现错误的具体情况也不相同。当使用PC或VAX时,程序执行过程是这样的:调用函数首先把参数放在一个被称为堆栈(stack)的临时存储区域里,然后被调函数从堆栈中读取这此参数。但是这两个过程并没有相互协调进行。调用函数根据调用过程中实际参数类型确定需要传递的数值类型,但是被调函数是根据其形式参数的类型进行数据读取的。因此,函数调用 imax(3)把一个整数放在堆栈中。当函数imax()开始执行时,它会从堆栈中读取两个整数。而实际上只有一个需要的数值被存储在堆栈中,所以第二个读取的数据就是当时恰好在堆栈中的其他数值。

    第二次使用函数imax()时,传递的是float类型的数值。这时两个double类型的数值就被放在堆栈中(回忆一下,作为参数传递时float类型数据会被转换成double类型数据)。而在我们使用的系统中,这意味着两个64位的数值,即共128位的数据存储在堆栈中。因为这个系统中int系统是32位,所以当imax()从堆栈中读取两个int类型的数值时,它会读取出堆栈中前面64位的数据,把这些数据对应于两个整数,其中较大的一个就是1074266112。

    9.2.2  ANSI的解决方案

    针对以上的参数错误匹配问题,ANSI标准的解决方案是在函数声明中同时说明所使用的参数类型。即使用函数原型(function prototype)来声明返回值类型、参数个数以及各参数的类型。为了表示imax()需要两个int类型的参数,可以使用下面原型中的任意一个进行声明:

    int imax(int ,int);

    int imax(int a,int b);

    第一种形式使用逗号对参数类型进行分隔;而第二种形式在类型后加入了变量名。需要注意的是这此变量名只是虚拟的名字,它们不必和函数定义中使用的变量名相匹配。

    使用这种函数原型信息,编译器就可以检查函数调用语句是否和其原型声明一致。比如检查参数个数是否正确,参数类型是否匹配。如果有一个参数类型不匹配但都是数值类型,编译器会把实际参数值转换成和形式参数类型相同的数值。例如 ,会把imax(3.0,5.0)换成imax(3,5).

    当使用函数原型时,上例中的程序清单9.4会变成如下程序清单9.5。

    程序清单9.5  proto.c程序

    /*misuse.c --使用函数原型*/
    #include <stdio.h>
    int imax(int,int);  /*原型*/
    int main(void)
    {
        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,5.0));
        return 0;
    }
    int imax(int n,int m)
    {
        int max;
        if(n>m)
            max=n;
        else
            max=m;
        return max;
    }

    当编译程序清单9.5时,编译器会给出一个错误信息,声称调用函数imax()时传递的参数太少。我们用imax(3,5)代替imax(3)后重新进行编译。这一次并没有出现任何错误信息。

    虽然编译中没有出现错误信息,但是编译器给出了一条警告信息,提示doube类型数据被转换成了int类型的数据,因此可能会损失数据。例如,以下函数调用:

    imax(3.9,5.4);等价于语句imax(3,5);

    错误和警告的不同之处在于前者阻止了编译的继续而后者不阻止。

    9.2.3  无参数和不确定参数

    假设使用以下函数原型:

    void printf_name();

    这时一个ANSI C 编译器会假设您没有用函数原型声明函数,它就不会进行参数检查。因此,为了表示一个函数确实不使用参数,需要在圆括号内加入void关键字:

    void printf_name(void);

    ANSI C 会把上句解释为pintf_name()不接受任何参数,因此当对函数进行调用时编译器就会检查以保证您确实没有使用参数。一些函数使用的参数个数是变化的。例如,在printf()中,第一个参数是一个字符串,而其余参数的类型以及参数个数并不固定。对于这种情况,ANSI C 允许使用不确定的函数原型。例如,对于printf()可以使用下面的原型声明:

    int printf(char *,...);

    这种原型表示第一个参数是一个字符串,而其余参数不能确定。

    对于参数个数不确定的函数,C库通过stdarg.h头文件提供了定义该类函数的标准方法。第16章“C预处理器和C库”详细讲述了有关内容。

    9.2.4  函数原型的优点

    函数原型是对语言的有力补充。它可以使编译器发现函数使用时可能出现的错误或疏漏

    有一种方法可以不使用函数原型却保留函数原型的优点。之所以使用函数原型,是为了在编译器编译第一个调用函数的语句之前向其表明该函数的使用方法。因此,可以在首次调用某函数之前对该函数进行完整的定义。这样函数定义部分就和函数原型有着相同的作用。通常对于较小的函数会这样做:

    //下面即是一个函数定义,也是它的原型

    int imax(int a,int b)  { return a>b ? a:b;}

    int main(void)

    {

    ...

    z=imax(x,50);

    ...

    }

     

    转载于:https://my.oschina.net/idreamo/blog/709144

    展开全文
  • 函数声明与定义

    2021-11-04 09:53:41
    函数声明:告诉编译器有这个函数,使得函数放在主函数后面也不会报错 函数声明格式:int Add(int x,int y) 函数的定义:即函数那一部分的结构体,如: int Add(int x, int y) { int z = 0; z = x + y; ...
  • 7.1新式函数原型1990 ISO C 标准在语言方面的最大变化是借鉴了 C++ 语言的函数原型。通过为每个函数指定其参数的数目和类型,各常规编译获得对每个函数调用的形参 (argument) 和实参 (parameter) 检查(类似于 lint ...
  • 简单来说,就是编译无法分辨你当前的代码是在声明一个函数原型,还是在调用一个函数。 我上面的代码,本来的意图是调用一个无参的构造函数,然后编译器认为我是在声明一个函数,这个函数的返回类型是MyArray,所以...
  • 4.4、函数的调用以及函数原型

    千次阅读 2015-03-06 10:59:23
    函数调用的一般形式 函数调用的一般形式为:  函数名([实参表列]); 如果是调用无参函数,则“实参表列”可以没有,但括号不能省略。如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,...
  • 1 什么是C语言的隐式函数声明在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自己主动依照一种隐式声明的规则,为调用函数的C代码产生汇编代码。以下是一个样例:int main(int argc, char** ...
  • }现在,尽管原型xyyzy在使用时未知,但这在c89模式下工作,因为没有原型的函数的默认返回类型是int隐式函数原型和实际函数是兼容的.而且,实际上,如果将函数的返回类型更改为float,则得到(如预期的那样):testprog.c:6: e...
  • C语言函数的定义和声明

    万次阅读 多人点赞 2019-08-08 14:38:17
    本科学C语言的时候,就对函数的定义和声明的作用很迷糊,刚看到一篇博客,写得非常清楚,贴出来与各位共享! 一、函数声明 1.在C语言中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用...
  • 以下是摘录的比较好的一篇说明:点击打开链接1 什么是C语言的隐式函数声明在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下面是...
  • 内联函数声明和定义

    千次阅读 2021-06-25 18:05:08
    一、什么叫inline函数? inline(小心,不是online),翻译成“内联”或“内嵌”。意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是...
  • 函数声明和定义一般都有参数,...以下三种方式声明和定义函数都是正确的。 第一种:常用的,声明和定义函数参数名称均一致。 int add(int a, int b);   // 函数声明 int add(int a, int b)    /
  • C语言直接调用未声明函数

    千次阅读 2019-12-19 11:42:00
    C语言直接调用未声明函数的坑,跟之前的一篇直接malloc返回值的错误有点像。 现象下面的函数调用,返回值的指针访问不了: main.c TestMalloc * test = FuncTest(); printf("%d",test); Test.h typedef ...
  • C语言函数原型

    2013-09-11 17:18:00
    在主调函数中调用某函数之前应对该被调函数进行说明(声明),这与使用变量之前要先进行变量说明是一样的。在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对...
  • 最近,我了解了C语言中的隐式函数声明。主要思想很明确,但在这种情况下,我对理解链接过程有些麻烦。考虑以下代码(文件a.c):#include int main() {double someValue = f();printf("%f", someValue);return 0;}如果...
  • C语言程序设计学习笔记:P7-函数

    千次阅读 2021-11-22 15:33:59
    本系列文章为浙江大学翁恺C语言...文章目录一、函数的定义和使用1.1 初见函数1.2 函数的定义和使用1.3 从函数中返回二、函数的参数和变量2.1 函数原型2.2 参数传递2.3 本地变量2.4 函数庶事小测验 一、函数的定义和使
  • 类的数据成员 在类中声明数据成员 类的数据成员的声明类似于普通变量的声明。如果一个类具有多个同一类型的数据成员,则这些成员可以在一个成员声明中指定。 class Cube { //Cube类表示立方体 ... //成员函数
  • 正如我们所见, 类的数据成员的声明类似于普通变量的声明。 如果一个类具有多个同一类型的数据成员, 则这些成员可以在一个成员声明中指定。 class Cube //Cube类表示立方体 { … //其他成员 long color; //数据...
  • 构造函数原型,继承、原型链、conlose对象及异常处理 1构造函数 每一个构造函数都有一个construction(构造器); 调用对象的construction偶可以获取到对象的构造函数,这个属性是原型对象提供的 2、函数有一个name...
  • 学习如何构造一个 C 文件并编写一个 C main 函数来成功地处理命令行参数。我知道,现在孩子们用 Python 和 JavaScript 编写他们的疯狂“应用程序”。但是不要这么快就否定 C 语言 —— 它能够提供很多东西,并且简洁...
  • 尽管在大多数教科书中内联函数声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与定义...
  • 第五周 函数标签(空格分隔):程序设计入门—C语言5.1函数#include void sum ( int begin, int end ){ int i, sum = 0; for ( i = begin; i ; i++ ){ sum += i; } printf("从%d到%d的和是%d\n", begin, en
  • 函数简介篇——线程相关函数

    千次阅读 2022-04-03 18:14:45
    说明: ...目录:一、线程基本操作函数pthread_equal()——比较线程IDpthread_self()——获取调用线程的IDpthread_create()——创建线程pthread_exit() ——结束线程pthread_join() ——阻塞线程pthre

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,901
精华内容 19,960
热门标签
关键字:

以下声明函数原型错误的是