精华内容
下载资源
问答
  • JavaScript函数声明前置与变量声明

    千次阅读 2016-07-06 17:27:51
    // 输出:我是函数声明func2(); // 报错 console.log(a); // 输出:undefinedfunction func1() { console.log("我是函数声明"); }var func2 = function() { console.log("我是函数表达式"); }var a = 10;因为JS会...

    先看一个例子

    func1();    // 输出:我是函数声明
    
    func2();    // 报错 
    
    console.log(a); // 输出:undefined
    
    function func1() {
        console.log("我是函数声明");
    }
    
    var func2 = function() {
        console.log("我是函数表达式");
    }
    
    var a = 10;

    因为JS会对函数声明前置,所以func1在函数声明前面执行依旧得到正确答案,而函数表达式func2则报错,为什么?我们先要弄清楚:

    JS解释器如何找到我们定义的函数和变量?
    通过 变量对象(Variable Object, VO)来获取。VO是一个抽象概念的“对象”,它用于存储执行上下文中的:1. 变量;2. 声明;3. 函数参数

    函数的VO分为两个阶段——变量初始化和代码执行。在变量初始化阶段,VO按照如下顺序填充:
    1. 函数参数(若未传入,初始化该参数值为undefined)
    2. 函数声明(若发生命名冲突,会覆盖)
    3. 变量声明(初始化变量值为undefined,若发生命名冲突,则忽略)

    注意:函数表达式与变量初始化无关。

    在变量初始化阶段,需要先对arguments变量进行初始化(激活对象,AO),再把函数体内的变量声明与函数声明存储在AO内,VO(functionContext) === AO。

    根据VO数据填充顺序看以下例子

    function test(a, b) {
        var c = 10;
        function d() {}
        var e = function _e() {}
        (function x() {});
        b = 20;
    }
    test(10);
    
    // 变量初始化阶段AO
    AO(test) = {
        a:10,
        b:undefined,
        c:undefined,
        d:<ref to func "d">,
        e:undefined
    };
    
    // 代码执行阶段AO
    AO(test) = {
        a:10,
        b:20,
        c:10,
        d:<ref to func "d">,
        e:function _e() {}
    };

    上述代码说明在变量初始化阶段,函数声明已经被填充至VO中,也就是进行了前置,而函数表达式不影响VO。同时,我们也看到变量在初始化与代码执行阶段的变化,下面测试另一个例子。

    alert(x);   // function x() {} 注:函数声明前置
    
    var x = 10; // 该声明被忽略
    alert(x);   // 10 注:在代码执行阶段将VO中的x对应值修改为10
    x = 20;
    
    function x() {}
    alert(x);   // 20 注:在代码执行阶段将VO中的x对应值修改为20
    
    if (true) {
        var a = 1;
    } else {
        var b = true;
    }
    
    alert(a);   // 1
    alert(b);   // undefined 注:赋值没被执行,在初始化阶段VO中b的值为undefined
    展开全文
  • 命名空间引起的函数声明问题

    千次阅读 2017-04-26 09:37:42
    在CSDN论坛上有朋友谈到以下问题,在main()函数之前并没有声明swap()函数,但是程序没有报错,并且正确完成了两个整形变量值之间的互换。代码如下所示: #include using namespace std; int _tmain(int argc, _...

    1 问题引入

    CSDN论坛上有朋友谈到以下问题,在main()函数之前并没有声明swap()函数,但是程序没有报错,并且正确完成了两个整形变量值之间的互换。代码如下所示:

    #include <iostream>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[])
    {
    int a = 3, b = 4;
    swap(a, b);
    cout<<"a="<<a<<",b="<<b<<endl;
    return 0;
    }
    void swap(int a1, int b1)
    {
    int c;
    c = a1;
    a1 = b1;
    b1 = c;
    }

    2 问题分析

    2.1 函数声明

    正如变量必须先声明后使用一样,函数也必须在被调用之前先声明。与变量的定义类似,函数的声明也可以和函数的定义分离,当然也可以定义的同时声明;一个函数只能定义一次,但是可以声明多次。函数的声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类型,但不必对形参命名。

    从以上介绍可以看出,在main()函数中调用swap()之前,必须要对swap()函数进行声明,但是程序中并没有对swap()函数声明并且可以成功调用swap()函数,主要原因就是程序中用到了命名空间。

    2.2 命名空间

    说起命名空间,就不得不提C++标准库。C++标准库涵盖范围非常大,包含了许多功能。所以标准库与第三方提供的程序库中的类型名称和函数名称可能会发生冲突。为了避免这个问题,C++标准库被放在名为“std”的空间中。由于标准库都包含在std空间中,当使用标准库中的函数或者类型时,必须显示地表达出使用的是命名空间std下的名字。例如,要使用std命名空间中的cin,则必须写成

    std::cin

    其中,::叫做作用域操作符,表示使用的是定义在std命名空间中的cin。很明显,通过作用域操作符来使用std命名空间中的函数或者类型是很麻烦的。可以使用using声明来进行化简。在程序的起始位置处加入如下代码

    using namespace std;

    一旦使用using声明,我们就可以直接引用函数或者类型,而不需要再引入命名空间的名字了。即此时可以直接使用cin了。

    从以上分析可以,上述程序中使用了C++标准库的命名空间std。因此,就可以使用std中的函数而不需要在函数名之前添加std命名空间。而C++标准库中有一个swap()函数模板,定义如下

    template<class _Ty> void std::swap(_Ty& _Left, _Ty& _Right);

    所以,在main()函数中调用的swap()函数并不是自定义的swap()函数,而是std::swap()函数模板!

    2.3 函数的非引用形参和引用形参

    每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。也就是说,对于参数是非引用类型的形参,在函数内部修改的是函数重新创建的实参副本,而不是实参本身。

    在本程序中自定义的swap()函数包含了两个非引用类型的参数,在main()函数中调用该函数

    swap(a, b);

    swap()函数中虽然对a和b进行了修改,实际上修改的并不是实参a和b,而是它们的副本。也就是说,此时a和b的值并没有进行交换。

    对于函数的引用类型的形参来说,它们直接关联到其绑定的对象,而并非这些对象的副本。也就是说,将swap()函数的两个参数定义为引用类型时,swap()函数对形参的修改,就是对实参本身的修改。

    所以,如果要使用自定义的swap()函数,则需要将swap()函数的形参改为引用类型。

    3 问题解决

    3.1 使用std命名空间中的swap()函数

    如果要直接使用std命名空间中的swap()函数,则将swap()函数的定义代码删掉即可。

    3.2 使用自定义的swap()函数

    如果要使用自定义的swap()函数,则首先需要在main()函数之前对swap()函数进行声明,之后将swap()函数的两个参数改为引用类型。

    修改后的代码如下所示

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    void swap(int &a1, int &b1);
    int _tmain(int argc, _TCHAR* argv[])
    {
    int a = 3, b = 4;
    swap(a, b);
    cout<<"a="<<a<<",b="<<b<<endl;
    return 0;
    }
    void swap(int &a1, int &b1)
    {
    int c;
    c = a1;
    a1 = b1;
    b1 = c;
    }


     

    展开全文
  • 函数声明和定义一般都有参数,...以下三种方式声明和定义函数都是正确的。 第一种:常用的,声明和定义函数参数名称均一致。 int add(int a, int b);   // 函数声明 int add(int a, int b)    /

    函数声明和定义一般都有参数,C语言中函数声明关注的是函数返回值类型、函数名称、函数参数类型,其中函数参数名称并不关注,因此参数名称可以在声明时省略,在定义时取任意名称。

    注意:声明和定义是有区别的,具体可以参见前面文章。

    [必须知道的C语言知识细节:声明和定义]

    以下三种方式声明和定义函数都是正确的。

    第一种:常用的,声明和定义函数参数名称均一致。

    int add(int a, int b);   // 函数声明
    
    int add(int a, int b)    // 函数定义
    
    {
    
        return a+b;
    
    }
    

    第二种:函数声明省略参数名称。

    int add(int , int );  // 函数声明
    
    int add(int a, int b) // 函数定义
    
    {
    
        return a+b;
    
    }
    

    第三种:函数声明和定义中参数名称可以不一致。

    int add(int a, int b);  // 函数声明
    
    int add(int c, int d)   // 函数定义
    
    {
    
        return c+d;
    
    }
    

    第三种是正确的,因为C语言中函数并不关注声明的函数参数名称,因此定义时可以对函数参数取任意名称。

    备注:函数定义时参数名称不能省略,如果省略,将无法在函数内部获得传递的实参值,函数参数也就失去作用。按照以下方式省略函数定义中的参数名称,编译会提示错误,函数定义中参数名称被省略。

    错误写法:

    int add(int , int );  // 函数声明
    
    int add(int , int ) // 函数定义
    
    {
    
        return 0;
    
    }
    

    其实做为一个学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C++基础交流583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。

    展开全文
  • 函数指针声明、赋值、调用

    千次阅读 2019-03-14 10:58:18
    一、函数指针声明 1、返回值类型 ( *指针变量名) ([形参列表]); ( *指针变量名) 函数指针声明时括号不能省略,否则...以下两种对函数指针的赋值哪个是正确的? int function(int a, int b) { //执行代码 } ...

    一、函数指针声明

    1、返回值类型 ( * 指针变量名) ([形参列表]);

    ( * 指针变量名)   函数指针声明时括号不能省略,否则改变了运算符的优先级,变成了返回一个指针的函数

    ([形参列表])函数括号中形参可有可无,视情况而定;

    二、函数指针赋值

    以下两种对函数指针的赋值哪个是正确的?
     

    int function(int a, int b)
    {
        //执行代码
    }
    
    int main(void)
    {
        int (*FP)(int, int) = function;
        int (*FP)(int, int) = &function;
    }

    网上说法:两个都是可以的。函数名是一个地址,可以将他赋值给一个指向函数的指针。前面加了&符号其意义是一样的。比如定义一个数组arr[],arr表示这个数组的首地址,但&arr同样表示他的首地址。这些都是设计语言时这样规定的

    确实两个都可以,但是网上其实说得不全对,特别是加了删除线的那一句,C/C++里面的数组名字会退化为指针,所以数组名a实际指的是数组的第一个元素的地址。而数组名作为指针来讲有特殊性,它正在它所指向的内存区域中,&a的值和a的数值是相同的,但是类型和意义不同。而指针的加法操作和指向的数据类型密切相关。

    int a[10]; a就相当于int *,如果是对它加1(a + 1)是相当于a + 1 * sizeof(int)。但是&a的类型则相当于int **,是所谓指向数组的指针,是数组元素类型的二级指针,对它加1是相当于 &a + 1 * sizeof(a)的,所以会偏移一个数组长度。

    二、函数指针调用


    下面对函数指针的调用哪种是正确的,还是都正确?

     

     

    int function(int a, int b)
    {
        //执行代码
    }
    
    int main(void)
    {
        int (*FP)(int, int);
        FP= function;    //第一种赋值方法
       // FP = &function;   //第二种赋值方法
        FP(1,2);       //第一种调用方法
       // (*FP)(1,2);  //第二种调用方法
    
    }
    两个也都是可以的,同理

     

     

    展开全文
  • C++函数声明规定只能为原型形式,真实目的是为了函数重载 我们说C++语言在技术上全面地兼容了C语言,并不意味着C++对C语言所有的非技术的东西都兼容。例如,对于函数声明的非原型形式,C++语言将不再支持,其原因...
  • 下面重载乘法运算符的函数原型声明正确的是: 正确答案: A B D 你的答案: D (错误) MyClass operator *(double ,MyClass); MyClass operator *(MyClass ,MyClass); MyClass operator *...
  • 函数有多个形参,如果其中一个定义有默认值,后面的(右侧)形参也必须定义默认值。 例:  void fun( int a,int b=1,int c);  错误  void fun( int a,int c,int b=1); 正确
  • 函数

    千次阅读 2017-10-29 17:24:08
    Python 函数函数是组织好的,可重复使用的,用来实现...定义一个函数你可以定义一个由自己想要功能的函数以下是简单的规则:函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。 任何传入参数和自变量必须
  • 对于vue生命周期我们还是要先了解清楚,因为不同的生命期用不同的钩子函数,先上图: 遇到的一个问题 在我的项目中,常用的生命周期钩子函数一直都是mounted,对于大部分情况,都是屡试不爽、捷报频传~ 但是在前几天...
  • 在C++语言中,以下说法正确的是()正确答案: A D 你的答案: A B C (错误)多态是通过虚表实现的构造函数可以声明为虚函数析构函数不可以声明为虚函数抽象类中至少包含一个纯虚函数C++中 的虚函数的作用主要是实现了...
  • 不能声明为虚函数函数

    千次阅读 2017-03-13 20:08:22
    (1)只能用virtual声明类的成员函数,使它成为虚函数,而不能将类外的普通函数声明为虚函数。因为虚函数的作用是允许在派生类中对基类的虚函数重新定义。显然,它只能用于类的继承层次结构中。 (2)一个成员函数...
  • 构造函数不能声明为虚函数,而析构函数可以声明为虚函数,在有的情景下析构函数必须声明为虚函数。 不建议在构造函数和析构函数里调用虚函数。 构造函数不能声明为虚函数的原因? 构造一个对象时,必须知道...
  • 声明函数函数指针

    千次阅读 2016-06-30 21:59:21
    概述  在很多情况下,尤其是读别人所写代码的时候,对 ... 问题:声明函数  有一段程序存储在起始地址为 0的一段内存上,如果我们想要调用这段程序,请问该如何去做?  答案  答案是 (*(void (*)(
  • 不能声明为虚函数函数

    千次阅读 2018-08-23 14:05:53
    常见的不能声明为虚函数的有普通函数(非成员函数)、静态成员函数、内联成员函数、构造函数和友元函数以下将分别对这几种情况进行分析。 1)普通函数(非成员函数)只能overload(重载),不能被override(覆盖...
  • 3)实际2)中的分析存在一个问题,“最后一条”,怎么算是最后一条,如果在函数调用后,还有函数声明呢?函数调用后的函数声明后还有函数调用呢?如何处理? 继续以实例分析. 例子3 #include void hello...
  • Python 函数

    千次阅读 2016-09-10 23:18:31
    概述函数是组织好的,可...定义函数你可以定义一个由自己想要功能的函数以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以
  • 以下是摘录的比较好的一篇说明:点击打开链接1 什么是C语言的隐式函数声明在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下面是...
  • 变量和函数的定义和声明

    千次阅读 2013-04-03 14:22:03
    2. 定义和声明  2.1. extern和static关键字  在上一节我们把两个程序文件放在一起编译链接,main.c用到的函数push、pop和is_empty由stack.c提供,其实有一点小问题,我们用-Wall选项编译main.c可以...
  • 为什么基类中的析构函数声明为虚析构函数? 解答 用对象指针来调用一个函数,有以下两种情况: 如果是虚函数,会调用派生类中的版本。如果是非虚函数,会调用指针所指类型的实现版本。 析构函数也会...
  • delphi中move函数正确理解

    万次阅读 2009-10-02 14:43:00
    我们能看到以下代码var pSource,pDest:PChar; len: integer;.......................//一些代码Move(pSource,pDest,len); //错误Move(pSource^,pDest^,len); //正确看起来确实好像是传值,而不是传地址,但是各位别...
  • 内联函数声明和定义

    万次阅读 2012-07-26 15:00:16
    一、什么叫inline函数? inline(小心,不是online),翻译成“内联”或“内嵌”。意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处...
  • 函数表达式

    万次阅读 2016-05-19 00:37:34
    函数表达式是javaScript中一个既强大又容易令人困惑的特性,在javaScript中定义函数的方式有两种,一种是函数声明,一种是函数表达式。函数声明的语法是这样的。function functionName(arg0, arg1) { }首先是...
  • C语言函数

    万次阅读 多人点赞 2019-08-03 19:54:19
    每个C程序都至少有一个函数,即主函数main(),如果程序的任务比较简单,全部的代码都写在main()函数中,但是,在实际开发中,程序的任务往往比较复杂,如果全部的代码都写在main()函数中,main()函数将非常庞大臃肿...
  • js之匿名函数详解

    千次阅读 多人点赞 2019-03-17 22:12:58
    1. 函数的声明与函数...关于函数声明,它最重要的一个特征就是函数声明提升,意思是执行代码之前先读取函数声明。不管函数声明写在前面,还是后面,都会出现函数声明的提升。 如下代码可以正确执行: add(1,2...
  • 函数隐式声明警告如何解决When compiling a C program you might find that the compiler gives you a warning similar to 编译C程序时,您可能会发现编译器向您发出类似于以下内容的警告 hello.c:6:3: warning: ...
  • 声明JavaScript函数的六种方法

    千次阅读 2016-07-29 17:02:13
    一个函数一次性定义的代码块可以多次调用。在JavaScript中,一个函数有很多元素组成,同时也受很多元素影响: 函数体的代码 ...这些元素都会影响到函数,但具体影响函数的行为还是取决于函数声明
  • Js函数

    千次阅读 热门讨论 2021-02-21 13:18:57
    目录JavaScript 函数定义自调用函数箭头函数JavaScript 函数参数参数规则默认参数ES6 函数可以自带参数arguments 对象JavaScript 函数调用this 关键字调用 JavaScript 函数作为一个函数调用函数作为方法调用使用构造...
  • python自定义函数

    千次阅读 2018-06-01 16:33:57
    函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()等。也可以创建用户自定义函数函数定义 函数定义的简单规则: 函数代码块以def关键词开头,后接函数标识符名称和圆括号...
  • 函数指针

    千次阅读 2019-06-05 17:21:03
    以下内容摘自 c++primer(第五版) 函数指针指向的函数而非对象。与其他指针一样,函数指针也指向特定的类型。函数的类型是由返回值和参数列表决定,与函数名无关。例如: //比较两个字符串的长度 bool ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 203,097
精华内容 81,238
关键字:

以下正确的函数声明