精华内容
下载资源
问答
  • 实参、形参、局部变量和全局变量

    千次阅读 2020-09-15 16:53:39
    目录实参和形参实参数据传递函数调用过程形参实参和形参的关系局部变量和全局变量局部变量局部变量的作用域说明:全局变量全局变量说明: 实参和形参 实参 实际参数简称“实参”。在调用有参函数时,函数名后面括号...

    实参和形参

    实参

    实际参数简称“实参”。在调用有参函数时,函数名后面括号中的参数称为“实际参数”,实参可以是常量、变量或表达式。

    在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称“实参”)。

    实参可以是常量、变量或表达式, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

    数据传递

    在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。该值在函数调用期间有效,可以参加该函数中的运算。

    在调用函数过程中发生的实参与形参间的数据传递,常称为“虚实结合”。

    函数调用过程

    1. 函数的形参列于函数声明中,在函数定义的函数体内使用。在未出现函数调用时,形参不占内存中的存储单元;当函数调用时,形参(任何种类的)是一类将被填充的空白或是占位符。
    2. 将实参的值传递给形参。当函数被调用时,实参列在函数名后面的括号里。执行函数调用时,实参被传递给形参。
    3. 在执行函数期间,由于形参已经有值,可以利用其进行相关运算。
    4. 通过return语句将函数值带回到主调函数。
    5. 调用结束,形参单元被释放。实参单元仍保留并维持原值(值传递)。

    形参

    全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。

    形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。

    没有形参的函数在形参表的位置应该写void.main 函数也可以有形参和返回值,其形参也称为命令行参数,由操作系统在启动程序时初始化,其返回值传递给操作系统。

    实参和形参的关系

    1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
    2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
    3. 实参和形参在数量上,类型上、顺序上应严格一致,否则就会发生类型不匹配的错误。
    4. 在一般传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参值发生改变,而实参中的值不会变化。而在引用调用的机制当中是将实参引用的地址传递给了形参,所以任何发生在形参上的改变实际上也发生在实参变量上。

    局部变量和全局变量

    局部变量

    局部变量,也称内部变量,是指在一个函数内部或复合语句内部定义的变量。

    局部变量的作用域是定义该变量的函数或定义该变量的复合语句。局部变量的生存期是从函数被调用的时刻算起到函数返回调用处的时刻结束。

    int f1(int a)
    {
    int b,c;
    ……
    }a,b,c作用域
    main()
    {
    int m,n;
    }

    在函数f1内定义了三个变量,a为形参,b,c为一般变量。在f1的范围内a,b,c有效,或者说a,b,c变量的作用域限于f1内。m,n作用域 m,n的作用域限于main函数内。

    局部变量的作用域说明:

    1. 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。
    2. 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
    3. 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。形参和实参的变量名都为n,是完全允许的。
    4. 在复合语句中也可定义变量,其作用域只在复合语句范围内。

    全局变量

    全局变量也称外部变量,它是在函数外部定义的变量。它不属于哪一个函数,而是属于一个源程序文件:其作用域是整个源程序。

    几乎程序中的所有函数都能使用全局变量,客观上全局变量就起到了在函数间传递数据的作用,甚至可以减少形参和实参的数量。当然在享用它的好处时,也要慎重,避免全局变量过多带来的降低函数通用性及存储空间的浪费。

    全局变量说明:

    1. 全局变量从程序运行起即占据内存,在程序整个运行过程中可随时访问,程序退出时释放内存。与之对应的局部变量在进入语句块时获得内存,仅能由语句块内的语句访问,退出语句块时释放内存,不再有效。
    2. 局部变量定义后不会自动初始化,除非程序员指定初值。全局变量在程序员不指定初值的情况下自动初始化为零。
    3. 在同一源文件中,允许全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用。
    int a,b;
    void f1()
    {
    ……
    }
    float x,y;
    int f2()
    {
    ……
    }
    main()
    {
    ……
    }

    从上例可以看出a、b、x、y 都是在函数外部定义的外部变量,都是全局变量。但x,y定义在函数f1之后,而在f1内又无对x,y的说明,所以它们在f1内无效。a,b定义在源程序最前面,因此在f1,f2及main内不加说明也可使用。

    展开全文
  • func_get_args()获取回...匿名函数获取外部变量 global全部变量 或者 function user(){ $name = '张三' $test = funtion() use ($name ){ } 或者 function user(){ $name = '张三' $test = funtion() use na

    func_get_args()获取回调方法形参

    -------------------------------------------------------------------------

    匿名函数获取外部变量

    global全部变量

    或者use ($name)语法

    function user(){

    $name = '张三'

    $test = funtion() use ($name ){

    }

    展开全文
  •  对于这个问题,首先我们应该明确的一点是对于匿名内部类,它可能引用三种外部变量:外部类的成员变量外部方法或作用域内的局部变量外部方法的参数而第一种变量是不需要声明为final的,但后两种是需要声明为final的...

     对于这个问题,首先我们应该明确的一点是对于匿名内部类,它可能引用三种外部变量:外部类的成员变量外部方法或作用域内的局部变量外部方法的参数而第一种变量是不需要声明为final的,但后两种是需要声明为final的。那这是为什么呢?不急,我们首先来看第一个知识点。知识点一,匿名内部类同所有类一样,都是有构造函数的,只不过这个构造函数是隐式的,虽然是内部类,但是经过编译之后,JVM还是会为匿名内部类生成单独的class文件的,如下述代码所示。
     编译前:

    public class Outer {
    
        String string = "";
    
        void outerTest(final char ch){
            final Integer integer = 1;
            Inner inner = new Inner() {
                void innerTest() {
                    System.out.println(string);
                    System.out.println(ch);
                    System.out.println(integer);
                }
            };
        }
    
        public static void main(String[] args) {
            new Outer().outerTest(' ');
        }
    
        class Inner {
        }
    
    }
    

     编译后:

    class Outer$1extends Outer.Inner
    {
      Outer$1(Outer paramOuter, char paramChar, Integer paramInteger)
      {
        super(paramOuter);
      }
    
      void innerTest()
      {
        System.out.println(this.this$0.string);
        System.out.println(this.val$ch);
        System.out.println(this.val$integer);
      }
    }
    

     被匿名内部类引用的变量会被拷贝一份到内部类的环境中 但其后,在外部,该变量如果被修改,则内部外部不一致 虽然,不一致也无所谓,而且代码可能原本就想不一致 但是,Java语言(版本8之前)要求设置为final,以保持一致性 这叫做:诚实 。
     以上,似乎并非有力的理由,但却就是这样设计的.
     java8只是对‘事实上final’变量可以不声明final标识符而已,其实还是要求final。所以java8及以后虽然可以不声明final标识符,但是这种变量只能赋值,不能修改。
    转自:https://www.zhihu.com/question/21395848

    展开全文
  • 全局变量,又称“外部变量”,它不是属于哪个方法,作用域从定义的地址开始到源文件结束。     注意事项:   当局部变量与全局变量重名时,起作用的是局部变量。 2.6 局部变量 ...

     

    1 前言

             本文档是描述编程基础中形参与实参、全局变量与局部变量的区别。

     

    2 名词解析

    2.1 形参

    定义:全称"形式参数",用于定义方法的时候使用的参数,目的用来接收调用该方法时传递的参数。

    说明:只有在被调用时才会分配内存单元,在调用结束,即刻释放所分配的内存单元。因此,只在方法内才有效。

    2.2 实参

    定义:全称"实际参数",用于调用时传递给方法的参数,即传递给被调用方法的值。

    说明:预先创建并赋予确定值。

    2.3 传值调用

    传值调用中,传递的参数类型是为常用的基本数据类型,参数视为形参,这里形参是局部变量。

    2.4 引用调用

    引用调用中,在Java中,传递的参数类型是为引用数据类型,参数视为实参。在调用机制里,将实参的地址传递给了形参,形参上的改变实际上都发生在实参上,可以视为全局变量。

    2.5 全局变量

             全局变量,又称“外部变量”,它不是属于哪个方法,作用域从定义的地址开始到源文件结束。

     

             注意事项:

             当局部变量与全局变量重名时,起作用的是局部变量。

    2.6 局部变量

             在方法内定义的变量称为“局部变量”或“临时变量”,方法结束后局部变量占用的内存将被释放。

    3 实例说明

    3.1 基本数据类型(传值调用)

    3.2 引用数据类型(引用调用)


    转载于:https://my.oschina.net/u/1177247/blog/156966

    展开全文
  • 什么是函数:程序中专门保存一段可重用的代码片段的程序结构,再起一个名字。...什么是形参变量:专门接收函数执行时必需的数据的变量 为什么要使用形参变量:有些函数执行时,必须传入必要的数据,才能正常的执行。
  • 区分静态变量、动态变量、内部变量(局部变量)、外部变量(全局变量)静态变量、动态变量、内部变量(局部变量)、外部变量(全局变量)变量的分类来看 静态变量、动态变量、内部变量(局部变量)、外部变量(全局...
  • 三、使用的形参为何要为final 参考文件:...也就是说:当所在的方法的形参需要被内部类里面使用时,该形参必须为final。 为什么必须要为final呢? 首先我们知道在内部类编译成...
  • 1、类体由2部分构成:  类成员变量和类成员方法 类成员变量(也可以叫全局变量) 在方法体外部声明的变量 作用域是整个类 局部变量 在方法体内部声明的变量 作用域是在本
  • 由于本身就在方法内部(可出现在形参定义处或方法体处),因而,访问方法中的局部变量形参是很正常的事情。 局部变量的生命周期与局部内部类的生命周期可能不一致。先看下面的示例代码public class TestInnerClass...
  • 为什么内部类调用的外部变量必须是final修饰的?

    千次阅读 多人点赞 2018-06-10 19:04:01
    问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到...
  • 3.extern 外部变量/全程变量(用于外部变量说明) 4.register 寄存器变量(分配在硬件寄存器中) 四大类,所有变量必须先说明(定义),后使用。 下面分别介绍 1.自动变量
  • java 方法内修改外部变量,值不变

    千次阅读 2020-02-15 18:31:47
    优化代码的时候遇到,无法修改变量的值。 场景: 现有两个java 方法,方法2包含在方法1中,方法1中的变量作为参数传入方法2,在方法2内部对这个传入的参数的值进行了修改。 public static void main(String[] args)...
  • 3.extern 外部变量/全程变量(用于外部变量说明) 4.register 寄存器变量(分配在硬件寄存器中) 四大类,所有变量必须先说明(定义),后使用。 下面分别介绍 1.自动变量
  • 我先把结论列出来:当成员变量形参是指针,最好不要使用:成员变量(形参)这样的形式。因为你可以不是进行:成员变量 = 形参这个方向的赋值,你可能是执行:形参 = 成员变量这个方向的赋值。因为前提,它们都是指针...
  • 3.extern 全程变量(用于外部变量说明) 4.register 寄存器变量(分配在硬件寄存器中) 四大类,所有变量必须先说明(定义),后使用。 下面分别介绍 1.自动变量(局部变
  • 以前错误的认为,全局变量名、局部变量名和形参名相同时,全局变量(也就是外部变量)被形参覆盖,形参被局部变量覆盖。 今天发现这样理解并不对。比如 function foo(num){ var num; console.log(num); } ...
  • 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域...
  • C++函数如何改变外部变量

    千次阅读 2020-10-14 13:42:51
    引用即是给变量起一个别名 int a = 5; int &b = a; cout<<a<<endl; cout<<b<<endl; cout<<&a<<endl; cout<<&b<<endl; 以上声明了
  • 3.extern 全程变量(用于外部变量说明) 4.register 寄存器变量(分配在硬件寄存器中) 四大类,所有变量必须先说明(定义),后使用。 下面分别介绍 1.自动变量(局部变量) 局部变量:在一个函数
  • 1. 如果没有将外部变量传递到函数中,函数内部可以使用,但是不能对该变量进行修改。如: 运行结果: 如果对外部变量test进行修改,则会报错:local variable ‘test’ referenced before assignment。如下: ...
  • 1、形参和实参 1.1 形参的含义及使用 1.2 实参的含义及使用 2、局部变量和全局变量 2.1 变量作用域的概念 2.2 局部变量 2.3 全局变量 2.4 修改全局变量
  • #include int a = 3,b = 5;... //函数声明,a,b是形参 int a = 8; //a是局部变量,局部变量a的作用范围主函数结束 printf("max = %d\n",max(a,b)); //全局变量b的作用范围主函数结束 return 0; } int
  • 外部变量和外部函数 外部变量和外部函数是指不仅可以在定义它的源文件内使用,还允许其在其他文件中使用。 需要指出的1:在命名空间作用域中的变量和函数,默认都是外部的。其他文件想要使用外部变量或者外部函数,...
  • 作用域是从空间的角度来分析的,分为全局变量和局部变量。   变量还有另一种属性——存储期(storage duration,也称生命期)。存储期是指变量在内存中的存在期间。这是从变量值存在的时间角度来分析的。存储期可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,147
精华内容 25,258
关键字:

形参是外部变量吗