精华内容
下载资源
问答
  • C++中使用形参改变实参变量的值 当实参普通变量的时候 若形参为指针,例如 ```bash int main() {int a=3,b=4; swap(&a,&b);} void swap(int *x,*y

    C++中使用形参改变实参变量的值

    1. 当实参为普通变量的时候
      若形参为指针,例如
    ```bash
                                        int main()
                                       {int a=3,b=4;
                                       swap(&a,&b);}
                                       void swap(int *x,*y)
                                       {x=1;
                                       y=2`}     
    
       另外一种情况就是形参为引用参数,
    
                                       int main()
                                       {int a=3,b=4;
                                       swap(a,b);}
                                       void swap(int &x,&y)
                                       {x=1;
                                       y=2`}  
    

    即不是将实际参数的地址传递到函数形参中,而是直接将对象名(变量名)传递过去

    2.当实际参数为数组的时候
    当形参为指针的时候,和上面的用法一致,只不过数组中传递地址的方式比较简单,只需要将数组名传递就好,另外形参接受地址时,也只需要写成下方的格式

                                       int main()
                                      {int a[]={1,2},b[]={3,4};
                                       swap(a,b);}
                                       void swap(int x[],y[])
                                       {} 
    

    或者

                                     int main()
                                      {int a[]={1,2},b[]={3,4};
                                       swap(a,b);}
                                       void swap(int *x,*y)
                                       {} 
    

    此外,也可以用引用的方式,这里不做赘述了

    展开全文
  • 举个简单的函数例子 function getNum(num){  num =100;  console.log(num); ...结果是:100和Uncaught ...虽然在函数中声明了一个隐式全局变量,可是函数的形参跟隐式全局变量的名字是相同的,而函数...

    举个简单的函数例子

    function getNum(num){

      num =100;

      console.log(num);

    }

    getNum();

    console.log(num);

     

    结果是:100和Uncaught ReferenceError: num is not defined

    虽然在函数中声明了一个隐式全局变量,可是函数的形参跟隐式全局变量的名字是相同的,而函数形参是个局部变量,而且是在隐式全局变量之前声明的,所以在外面不能获取到内部的值。

    转载于:https://www.cnblogs.com/drizzle-wen/p/8868408.html

    展开全文
  • 在我们自己写代码时,一般不会做这种蠢事情,把形参和局部变量定义同名,可如果真的这样做了呢? 那就要分析下JS执行上下文中的变量对象了,这个知识点不牢固的同学可以移步这里: 重拾ECMAScript基础——变量、...

    前言

    上次牛客网做到这样一个题,非常有意思,陷阱非常多,当时觉得搞明白了,现在再看到,又糊涂了,发现了新的点,看一下:

    var foo={n:1};
    
    
    (function (foo) {
        console.log(foo.n);
        foo.n = 3;
        var foo = {n:2};
        console.log(foo.n);
    })(foo);
    
    
    console.log(foo.n);

    乍一看,是局部和全局变量的一些区分问题,其实坑很多,下面我们一点点分析下;

    变量的定义(宣告)和赋值

    首先我们看一段代码:

    var a = 1;
    var a;
    console.log(a);//1

    这里第二行对a是一个重复宣告,而不是赋值,变量只有定义(宣告)后未赋值的情况下才会输出undefined,除非手动赋值undefined;那么这里,JS引擎对于重复宣告的规定以最近的变量指定(也就是赋值)作为变量在执行时的值,所以第二行的var a;其实相当于无效;

    函数中形参和局部变量同名

    在我们自己写代码时,一般不会做这种蠢事情,把形参和局部变量定义为同名,可如果真的这样做了呢?
    那就要分析下JS执行上下文中的变量对象了,这个知识点不牢固的同学可以移步这里:重拾ECMAScript基础——变量、作用域
    作用域链对变量的保存都是在变量对象中的,那么ES5对形参在变量对象中是如何保存的呢,请看规范:

    10.5 Declaration Binding Instantiation
    Every execution context has an associated VariableEnvironment. Variables and functions declared in ECMAScript code evaluated in an execution context are added as bindings in that VariableEnvironment‘s Environment Record. For function code, parameters are also added as bindings to that Environment Record.

    就是说,无论是形参还是函数中声明的变量,JS对他们的处理是没有区别的,都是保存在这个函数的变量对象中作为局部变量进行处理;那么结合上面我们说到的变量的重复宣告,接下来同名的问题就很简单了,看代码:

    (function fun (param) {
        var param;
        console.log(param);//1
        param = 2;
        console.log(param);//2
    })(1);

    在这里,同名的局部变量和形参其实是同一个东西,都是在函数的变量对象里的保存的那个变量;

    如果变量是引用类型呢?

    那么如果变量是个对象的话,就是我们文章一开始提到的题目了,下面我们分析下:

    var foo = {n : 1};
    (function(foo) {
        console.log(foo.n);
        foo.n = 3;
        var foo = {n : 2};
        console.log(foo.n);
    })(foo);
    console.log(foo.n);
    
    
    var foo = {n : 1};
    function fun(foo) {
        var foo;
        console.log(foo.n);
        foo.n = 3;
        foo = {n : 2};
        console.log(foo.n);
    };
    fun(foo);
    console.log(foo.n);

    上下两段代码,意思是一样的,我把匿名立即执行函数换成了普通函数并在下一行调用,方便大家理解;

    其实分析一下,就是这么几个问题;
    内部foo变量提升;
    内部foo和形参同名;
    内部foo重复宣告;
    所以内部var的那个foo和形参foo是同一个东西,并没有发生变化;
    然后重复宣告不影响之前的赋值,所以第一个为1;
    接下来,foo.n=3,由于形参为对象,所以是传进来的是一个对象的引用(指针);
    对这块知识点不牢固的同学还是请移步我之前那篇文章;
    那么这个引用指向的堆内存的那块空间里的n改变为3;
    接下来,foo={n:2};这个就很有意思了,我们刚才也说了,传进来的是个引用;
    现在给这个引用赋值,实际上就是让它指向新开辟的空间,存放着{n:2}这个对象;
    那么之前的引用就断掉了,也就是说形参foo已经不指向全局里那个foo指向的空间了;
    固然,在函数里,会输出新空间里的2;
    而在函数外,旧空间仍然没有改变,故为3;

    总结

    其实这个题目考了很多知识点,最后就是参数传递中引用类型的用法,这个也是ECMAScript中基础的一个难点,结合前面的一些,变量提升,重复宣告,形参与局部变量同名,算是解释清楚了。

    若有错误,欢迎指出。

    展开全文
  • 而在代码修改时,如果真正使用了些变量,直接将此句删除,也是很简单的一件事。 但是,实际上在Windows中,此宏仅被用来消除warning C4100: 未引用的形参警告,因为宏的名称是UNREFERENCED_ PARAMETER。所以如果...

    如果我们编译以下代码:

    #include <stdio.h>

    int main(int argc, char** argv)
    {
        int n;
        int nRet = printf("Hello, world!");
        return 0;    
    }

    编译器一般会发出以下警告(VS2015):

    1>f:\mycode\cpptest\main.cpp(55): warning C4100: “argv”: 未引用的形参
    1>f:\mycode\cpptest\main.cpp(55): warning C4100: “argc”: 未引用的形参
    1>f:\mycode\cpptest\main.cpp(67): warning C4101: “a”: 未引用的局部变量
    1>f:\mycode\cpptest\main.cpp(68): warning C4189: “nRet”: 局部变量已初始化但不引用

    编译器认为,既然我们已经声明/定义了某变量,那我们就有使用它的意图。所以当它检测到我们未对此变量进行实际的使用时,就会发出警告,提醒我们检查代码是否存在错误。

    为了代码编译时输出窗口的整洁(以使有价值的提示信息更醒目),我们通常会消除掉此类警告(当然是在我们确认这是有意为之之后)。而在消除此类警告时,隐式地,我们一般有以下四种期望:

    编译器不再发出此警告;
    不会引起代码逻辑变化;
    不会造成性能损失;
    不会对代码维护造成负担,包括阅读和修改;
    以下提供两种经典解决方案,并分析网上流传的一些方法为什么不可取。

    一、宏UNREFERENCED_PARAMETER

    Windows开发人员使用宏定义方案。在Windows平台下,可以在<winnt.h>中找到以下宏定义:

    #define UNREFERENCED_PARAMETER(P)          (P)

    使用方法如下:

    int main(int argc, char** argv)
    {
        UNREFERENCED_PARAMETER(argc); // 手动醒目
        UNREFERENCED_PARAMETER(argv); // 手动醒目

        int n;
        UNREFERENCED_PARAMETER(n); // 手动醒目
        int nRet = printf("Hello, world!");
        UNREFERENCED_PARAMETER(nRet); // 手动醒目
        return 0;    
    }

    因为实际上,代码被宏展开为如下形式:

    int main(int argc, char** argv)
    {
        (argc); // 手动醒目
        (argv); // 手动醒目

        int n;
        (n); // 手动醒目
        int nRet = printf("Hello, world!");
        (nRet); // 手动醒目
        return 0;    
    }
    ,即argc、argv、n和nRet确实被使用(作为一条单独的语句),所以警告不会再产生。 
    如果严格按照这样一个变量一条语句的写法,代码逻辑就绝不会发生变化;同时,在release模式下,这些代码完全会被优化掉,所以对性能也不会造成影响。

    另外,宏的名称UNREFERENCED_PARAMETER已经说明,这是一个未被引用的参数,所以在阅读时不仅不会造成障碍,反而会有助于理解;而在代码修改时,如果真正使用了些变量,直接将此句删除,也是很简单的一件事。

    但是,实际上在Windows中,此宏仅被用来消除warning C4100: 未引用的形参警告,因为宏的名称是UNREFERENCED_ PARAMETER。所以如果在我们的项目中应用此解决方案时,最好自己定义一个名称更应景的宏,譬如:

    #define UNREFERENCED_VALUE(P)          (P)

    以同时完美应用于上述三种警告。

    二、模板空函数PX_UNUSED()

    NVIDIA的PhysX项目开发人员使用模板空函数解决方案。在PhysX开源代码的include\foundation\PxPreprocessor.h中可以找到如下定义(同时还有某些对此方法的疑问,下面各节将会回答这些疑问):

    // avoid unreferenced parameter warning (why not just disable it?)
    // PT: or why not just omit the parameter's name from the declaration????
    template <class T> PX_CUDA_CALLABLE PX_INLINE void PX_UNUSED(T const&) {}

    使用方法如下:

    int main(int argc, char** argv)
    {
        PX_UNUSED(argc); // 手动醒目
        PX_UNUSED(argv); // 手动醒目

        int n;
        PX_UNUSED(n); // 手动醒目
        int nRet = printf("Hello, world!");
        PX_UNUSED(nRet); // 手动醒目
        return 0;    
    }

    首先,原本未被引用的变量确实被用来调用函数了,所以警告被消除。应该注意到,在PX_UNUSED()实现时有一个细节,它没有给出参数的具体名称const T&,所以警告不会再传递(见“三、为什么不应该直接删除函数参数名”)。

    其次,因为仅被用来调用空函数,且是传引用方法,所以代码逻辑不会被影响;而空函数在release模式下也会被优化掉,所以也不会产生性能影响,顶多在编译时生成模板函数增加了一点点时间。

    最后,此函数被使用时,同样醒目且易删除,所以也不会对代码维护造成额外的负担。

    相对于宏定义的方式,我比较赞成此种解决方案,因为前者有可能因为误用而造成莫名其妙的错误。
    --------------------- 

    原文:https://blog.csdn.net/u012494876/article/details/53400679 
     

    展开全文
  • Swift的可变形形参, 常量形参, 变量形参, In-Out形参
  • 变量的内存地址与指针指针变量指针变量的赋值指针变量运算符及运算指针变量运算指针变量作为函数参数由数据变量指针变量由指针变量传地址改数据变量传数据数组与地址指针数组名作函数参数指向数组的指针变量作...
  • 以下为简单的例子,在函数中也是同样的情况: console .log(x); //undefined,而不是报错 var x = 5 ; 相等于下面这样: var x; console .log(x); x = 5 ; 解题 第一个函数 问题的第...
  • 第7章 函数 函数是重要的程序段。它们允许你给一块语句一个名称,然后你可以在程序的任何地方使用...圆括号中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。 # -*- coding:utf-8 –*- ...
  • 一. 实参、形参和值传递 首先我们要知道什么是形参,什么是实参? 形参,顾名思义,形式上的参数,在定义函数时函数名后面括号里面的变量名称就是形参;而实参就是平常定义的变量;... 什么调用了函数之后变量...
  • 以前错误的认为,全局变量名、局部变量名和形参名相同时,全局变量(也就是外部变量)被形参覆盖,形参被局部变量覆盖。...//如果错误的理解局部变量会覆盖形参的话,会认为会输出undefined 那事...
  • 1.函数与变量重名 console.log(foo);...原因很简单变量对象的创建过程有关。 全局上下文中的变量对象 全局上下文环境包括变量对象,作用域链,this指针三部分 理解全局上下文环境的变量对象之前先了解.
  • Java 变量 形参和实参

    2020-12-28 10:52:56
    3. 简单来说就是进行函数调用的时候需要实参从主函数中传给被调用函数中的形参,这样函数才可以执行,实参和形参起到一个桥梁的作用。 /*-- 例子 --*/ public class Test { public static void main(String...
  • 实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。函数的形参和实参具.....
  • 全局指针变量形参

    2021-04-08 16:20:11
     正常的情况咱们就不说了,太简单了,比如正常的int num; void test(int c)做参数,那么肯定不会改变num的值。因为你知道没用&或者*. 1.全局变量指针做参数:  这个是指针吧?这个又是全局变量吧?什么结果....
  • 我先把结论列出来:当成员变量形参是指针,最好不要使用:成员变量(形参)这样的形式。因为你可以不是进行:成员变量 = 形参这个方向的赋值,你可能是执行:形参 = 成员变量这个方向的赋值。因为前提,它们都是指针...
  • 例子: int fun1(int a, int b) { a = 1; b = 2; return a+b; } for example: a = 3; b = 4; fun1(a, b); printf("a = %d b= %d", a, b); 如果是地址传递,那就是输出a=1 b=2 ...但实际上运
  •   目录 函数是什么? ... 简单一个示例 ... #函数形参位置混杂测试优先级(位置、元组、(关键、默认)、字典) 全局变量与局部变量 递归原理和示例 函数是什么? 函数一词来源于数学,但编程中的「函...
  •  问题及代码: /* *Copyright (c)2014,烟台...*All rights reserved....用指针当形参进行变量交换。 学习心得: 用指针当形参可以很方便的进行一些操作,这个交换函数是个简单的例子。
  • c语言中指针是一种保存变量地址的变量。...y = *p /*y的值现1*/ /*编写代码时要注意,你可能觉得自己只是在修改*p变量的值, 但你忘了p中存了x变量的地址, 修改*p的值相当于修改了p指向的变量的值 */ *p = 0
  • 文章目录一、函数的定义1、定义一个函数2、形参3、实参二、形参1、位置参数2、默认参数3、可变参数4、关键字参数三、函数的返回值四、局部变量和全局变量的作用域1、局部变量2、 全局变量五、练习1234 一、函数的...
  • 文章目录一、函数的定义1、定义一个函数2、形参3、实参二、形参1、位置参数2、默认参数3、可变参数4、关键字参数三、函数的返回值四、局部变量和全局变量的作用域1、 全局变量2、局部变量 一、函数的定义 函数是...
  • c++ 简单形参使用

    2021-03-29 23:10:42
    只想到这些以后还有再补充 #include<iostream> using namespace std;... //因形参为局部变量,相当于将实参的值复制来一个新的局部变量内,使用规则同r[] //所以main函数内的ab的值不会改变 int temp = .
  • 1.标识符命名规则: 定义 就是给类,接口,方法,变量等起名字的字符序列 组成规则 英文大小写字母数字$和_ ...形参可以是常量,变量或表达式 实参可以任何类型 形参应与其对应的实参类型一
  • 在我们自己写代码时,一般不会做这种蠢事情,把形参和局部变量定义同名,可如果真的这样做了呢? 那就要分析下JS执行上下文中的变量对象了,这个知识点不牢固的同学可以移步这里:重拾ECMAScript基础——变量、...
  • 今天课课家笔者大家详细介绍局部变量和全局变量的概念和作用。在函数的参数和返回值中我们认识到形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量只能在函数内部使用,离开该函数就...
  • 个人认为:这里的简单变量应该是指内置类型,内置类型数据在传入函数时,使用值传递方式的效率要高于引用传递和指针传递,因此编译器会采用效率最高的方式来实现参数传递,所以选B(当然也允许用户更改),事实上...
  • 先看一段代码 #include #include ...其实有一种简单方式,在被调函数外面先分配好内存,再把指针传递进去,或者干脆在被调函数里面定义指针,分配内存,然后返回指针就好了,这样不容易出错。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,840
精华内容 34,736
关键字:

形参为简单变量