精华内容
下载资源
问答
  • T[].JLS 8.4.1格式参数列表中最后一个形式参数是特殊;它可能是可变度参数,由类型后面省略号指示。如果最后一个形式参数是类型的变量性参数T,它被认为定义了一个类型形式参数。T[]..然后,该方法是可变...

    18bbc04e016dcfe773c9b9e3ed3c33dc.png

    墨色风雨

    是的,aT...只是一种语法糖。T[].JLS 8.4.1格式参数列表中的最后一个形式参数是特殊的;它可能是可变度参数,由类型后面的省略号指示。如果最后一个形式的参数是类型的变量性参数T,它被认为定义了一个类型的形式参数。T[]..然后,该方法是可变度方法。否则,它就是固定性方法。变量方法的调用可能包含比形式参数更多的实际参数表达式。所有与变量性参数之前的形式参数不对应的实际参数表达式都将被计算,并将结果存储到将传递给方法调用的数组中。这里有一个例子来说明:public static String ezFormat(Object... args) {

        String format = new String(new char[args.length])

            .replace("\0", "[ %s ]");

        return String.format(format, args);}public static void main(String... args) {

        System.out.println(ezFormat("A", "B", "C"));

        // prints "[ A ][ B ][ C ]"}是的,上面main方法是有效的,因为同样,String...只是String[]..而且,由于数组是协变的,所以String[]是Object[],所以你也可以打电话给ezFormat(args)不管怎样。另见Java语言指南/varargsVarargs抓到#1:传球null如何解决varargs是相当复杂的,有时它所做的事情可能会令你吃惊。考虑这个例子:static void count(Object... objs) {

        System.out.println(objs.length);}count(null, null, null); // prints "3"count(null, null); // prints "2"count(null); 

        // throws java.lang.NullPointerException!!!由于varargs是如何解析的,最后一条语句将调用objs = null,这当然会导致NullPointerException带着objs.length..如果你想给一个null参数为varargs参数时,可以执行以下任一操作:count(new Object[] { null }); // prints "1"count((Object) null); // prints "1"相关问题以下是人们在处理varargs时提出的一些问题的示例:有静脉曲张和超载?如何处理varargs和反射最具体的固定/可变度匹配方法(Varargs)Vararg Gochas#2:添加额外的参数正如您所发现的,以下内容“行不通”:    String[] myArgs = { "A", "B", "C" };

        System.out.println(ezFormat(myArgs, "Z"));

        // prints "[ [Ljava.lang.String;@13c5982 ][ Z ]"因为瓦拉格的工作方式,ezFormat实际上有两个参数,第一个参数是String[],第二个是String..如果要将数组传递给varargs,并且希望将其元素识别为单个参数,并且还需要添加额外的参数,那么除了创建另一个数组可以容纳额外的元素。下面是一些有用的帮助方法:static  T[] append(T[] arr, T lastElement) {

        final int N = arr.length;

        arr = java.util.Arrays.copyOf(arr, N+1);

        arr[N] = lastElement;

        return arr;}static  T[] prepend(T[] arr, T firstElement) {

        final int N = arr.length;

        arr = java.util.Arrays.copyOf(arr, N+1);

        System.arraycopy(arr, 0, arr, 1, N);

        arr[0] = firstElement;

        return arr;}现在您可以执行以下操作:    String[] myArgs = { "A", "B", "C" };

        System.out.println(ezFormat(append(myArgs, "Z")));

        // prints "[ A ][ B ][ C ][ Z ]"

        System.out.println(ezFormat(prepend(myArgs, "Z")));

        // prints "[ Z ][ A ][ B ][ C ]"Varargs抓到#3:传递一个原语数组它不“起作用”:    int[] myNumbers = { 1, 2, 3 };

        System.out.println(ezFormat(myNumbers));

        // prints "[ [I@13c5982 ]"Varargs只适用于引用类型。自动装箱不适用于原语数组。以下工作:    Integer[] myNumbers = { 1, 2, 3 };

        System.out.println(ezFormat(myNumbers));

        // prints "[ 1 ][ 2 ][ 3 ]"

    展开全文
  • 列表中最后一个形式参数是特殊;它可能是可变度参数,由类型后面省略号指示。如果最后一个形式参数是类型的变量性参数T,它被认为定义了一个类型形式参数。T[]..然后,该方法是可变度方法。否则,它就是...

    是的,aT...只是一种语法糖。T[].列表中的最后一个形式参数是特殊的;它可能是可变度参数,由类型后面的省略号指示。

    如果最后一个形式的参数是类型的变量性参数T,它被认为定义了一个类型的形式参数。T[]..然后,该方法是可变度方法。否则,它就是固定性方法。变量方法的调用可能包含比形式参数更多的实际参数表达式。所有与变量性参数之前的形式参数不对应的实际参数表达式都将被计算,并将结果存储到将传递给方法调用的数组中。

    这里有一个例子来说明:public static String ezFormat(Object... args) {

    String format = new String(new char[args.length])

    .replace("\0", "[ %s ]");

    return String.format(format, args);}public static void main(String... args) {

    System.out.println(ezFormat("A", "B", "C"));

    // prints "[ A ][ B ][ C ]"}

    是的,上面main方法是有效的,因为同样,String...只是String[]..而且,由于数组是协变的,所以String[]是Object[],所以你也可以打电话给ezFormat(args)不管怎样。

    另见

    Varargs抓到#1:传球null

    如何解决varargs是相当复杂的,有时它所做的事情可能会令你吃惊。

    考虑这个例子:static void count(Object... objs) {

    System.out.println(objs.length);}count(null, null, null); // prints "3"count(null, null); // prints "2"count(null);

    // throws java.lang.NullPointerException!!!

    由于varargs是如何解析的,最后一条语句将调用objs = null,这当然会导致NullPointerException带着objs.length..如果你想给一个null参数为varargs参数时,可以执行以下任一操作:count(new Object[] { null }); // prints "1"count((Object) null); // prints "1"

    相关问题

    以下是人们在处理varargs时提出的一些问题的示例:

    Vararg Gochas#2:添加额外的参数

    正如您所发现的,以下内容“行不通”:String[] myArgs = { "A", "B", "C" };

    System.out.println(ezFormat(myArgs, "Z"));

    // prints "[ [Ljava.lang.String;@13c5982 ][ Z ]"

    因为瓦拉格的工作方式,ezFormat实际上有两个参数,第一个参数是String[],第二个是String..如果要将数组传递给varargs,并且希望将其元素识别为单个参数,并且还需要添加额外的参数,那么除了创建另一个数组可以容纳额外的元素。

    下面是一些有用的帮助方法:static  T[] append(T[] arr, T lastElement) {

    final int N = arr.length;

    arr = java.util.Arrays.copyOf(arr, N+1);

    arr[N] = lastElement;

    return arr;}static  T[] prepend(T[] arr, T firstElement) {

    final int N = arr.length;

    arr = java.util.Arrays.copyOf(arr, N+1);

    System.arraycopy(arr, 0, arr, 1, N);

    arr[0] = firstElement;

    return arr;}

    现在您可以执行以下操作:String[] myArgs = { "A", "B", "C" };

    System.out.println(ezFormat(append(myArgs, "Z")));

    // prints "[ A ][ B ][ C ][ Z ]"

    System.out.println(ezFormat(prepend(myArgs, "Z")));

    // prints "[ Z ][ A ][ B ][ C ]"

    Varargs抓到#3:传递一个原语数组

    它不“起作用”:int[] myNumbers = { 1, 2, 3 };

    System.out.println(ezFormat(myNumbers));

    // prints "[ [I@13c5982 ]"

    Varargs只适用于引用类型。自动装箱不适用于原语数组。以下工作:Integer[] myNumbers = { 1, 2, 3 };

    System.out.println(ezFormat(myNumbers));

    // prints "[ 1 ][ 2 ][ 3 ]"

    展开全文
  • 1.1形参(形式参数)在函数定义中出现参数可以看做一个占位符,它没有数据,只能等到函数被调用时接收传递进来数据,所以称为形式参数,简称形参。1.2实参(实际参数)函数被调用时给出参数包含了实实在在数据...

    1.形参与实参

    C语言函数的参数会出现在两个地方,分别是函数定义处和函数调用处,这两个地方的参数是有区别的。

    1.1形参(形式参数)

    在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。

    1.2实参(实际参数)

    函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。

    1.3形参和实参的区别和联系

    1) 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。

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

    3) 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。

    4) 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。

    2.局部变量与全局变量

    2.1局部变量

    定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。

    例如:

    int f1(int a){

    int b,c; //a,b,c仅在函数f1()内有效 return a+b+c;

    }

    int main(){

    int m,n; //m,n仅在函数main()内有效 return 0;

    }

    几点说明:

    1) 在 main 函数中定义的变量也是局部变量,只能在 main 函数中使用;同时,main 函数中也不能使用其它函数中定义的变量。main 函数也是一个函数,与其它函数地位平等。

    2) 形参变量、在函数体内定义的变量都是局部变量。实参给形参传值的过程也就是给局部变量赋值的过程。

    3) 可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互不干扰,也不会发生混淆。

    2.2全局变量

    在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。如果给全局变量加上 static 关键字,它的作用域就变成了当前文件,在其它文件中就无效了。

    例如:

    int a, b; //全局变量void func1(){

    //TODO:}

    float x,y; //全局变量int func2(){

    //TODO:}

    int main(){

    //TODO: return 0;

    }

    注:

    1)a、b、x、y 都是在函数外部定义的全局变量。C语言代码是从前往后依次执行的,由于 x、y 定义在函数 func1() 之后,所以在 func1() 内无效;而 a、b 定义在源程序的开头,所以在 func1()、func2() 和 main() 内都有效。

    2)当全局变量和局部变量同名时,在局部范围内全局变量被“屏蔽”,不再起作用。或者说,变量的使用遵循就近原则,如果在当前作用域中存在同名变量,就不会向更大的作用域中去寻找变量。

    3.动态变量与静态变量

    3.1区别

    定义或者声明变量时,没有static修饰符的就是动态变量,有static修饰符的就是静态变量。

    3.2静态存储与动态存储

    1)静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束,静态存储只会初始化一次。静态变量,全局动态变量都是静态存储。

    2)动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。

    3.3动态变量(简称变量)

    全局变量

    1)在所有函数的外部定义(包括主函数),定义之后的所有函数都能使用,属于静态存储。

    2)作用域为整个项目,即最终编译成可执行文件的所有文件中均可以使用动态全局变量。外部文件可以通过extern关键字来声明另一个文件中存在的全局变量。

    3)无显式初始化时默认初始化值为0。

    局部变量

    1)在函数内部定义,属于动态存储,其他函数不能访问,外部文件也不能访问。

    2)无显式初始化时默认初始化值为随机值。

    3.4静态变量

    静态全局变量

    与动态全局变量的主要不同:动态全局变量可以通过extern关键字在外部文件中使用,但静态全局变量不可以在外部文件中使用。静态全局变量相当于限制了动态全局变量的作用域。

    静态局部变量

    与动态局部变量的主要不同:两者作用域相同,都在函数内部,但是两者生命周期不一样,静态局部变量的生命周期是到程序的结束,而动态局部变量的生命周期是函数的结束,静态局部变量的生命周期更长,同时静态局部变量只会初始化一次,函数重复调用,但静态局部变量不会被重新初始化。

    展开全文
  • 在任何一种编程语言中,作用域程序中定义的变量所存在区域,超过该区域的变量就不能被访问。我相信很多初学者对于作用域不太了解,作用...形式参数的函数参数定义中全局变量我们都知道定义在函数外部的变量叫全...

    在任何一种编程语言中,作用域是程序中定义的变量所存在的区域,超过该区域的变量就不能被访问。我相信很多初学者对于作用域不太了解,作用域没有被老师或者教程详细的讲解,导致对于作用域的认识不太清晰。下面将会对全局变量、局部变量以及形参实参进行说明。

    C语言中有三个地方可以用于声明变量:

    1.所有函数外部的全局变量

    2.函数或者块内的局部变量

    3.形式参数的函数参数定义中

    全局变量

    我们都知道定义在函数外部的变量叫全局变量,通常定义在程序的顶部。作用域是整个程序。

    我们看下图:

    4488fc6738e92195d9d7f13dfa5540dc.png

    int g;很明显就是全局变量,因为它在函数的外部,并且在程序的顶部。(全局变量也可以定义在程序的中间,但是它上面的函数将不能对它进行引用)

    值得注意的是:在程序中是允许全局变量和局部变量的名称相同的,但是在函数的内部,全局变量的值会被局部变量的覆盖。

    实例以及结果:

    fec44a20f57522161f2385ab8715b45e.png

    图中可以看出a打印出来的值为10,所以在名字相同的情况下,全局变量将会被覆盖。

    局部变量:

    在函数内部或者块内部定义的声明的变量称为局部变量。所以只能在函数中使用。

    实例:

    105fefaf0528b4d602cef4bb7ed5c52e.png

    明显可以看出a,b定义在函数内部,所以它们是局部变量。

    形式参数(形参)和实际参数(实参)

    形式参数是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时的参数。形式参数优先覆盖全局变量。实际参数是在调用时传递该函数的参数。请看下面的例子:

    7249a17a12c1dad2fffdd000f34c163f.png

    从图中可以看出,c = sum(a,b);中的a,b为实际参数,因为它们是传递实际的值。而int sum(int a,int b)中a,b就是形式参数。因为它们用于接收传递过来的值。

    最后还要说一下的是对于全局变量和局部变量的初始化。对于局部变量来说,如果你在定义的时候不对它进行初始化,系统也不会对它进行初始化。它的值会等于在系统分配给它内存之前的内存的值。但是对于全局变量来说,你不对它初始化,系统自动初始化。每个类型初始化如下:

    数据类型初始化默认值

    int

    0

    char

    '\\0'

    float

    0

    double

    0

    pointer

    NULL

    所以,最好在定义变量时就对它进行初始化。这样子会避免程序的出错,带来意想不到的后果。

    作用域就是变量在程序中定义的位置,文中对全局变量、局部变量以及形参实参进行了简单的说明了解,并带有代码帮助大家更好的理解。代码并不复杂,可以说非常的简单。文中代码的作用并不是为了得到结果,而是方便理解变量定义所在的位置。希望本文能对作用域概念模糊的朋友有所帮助。

    展开全文
  • 1、形参: 即形式参数,它定义函数名和函数体时使用参数,目的接收调用该函数传递参数。 2、实参: 即实际参数,它在调用时传递给函数参数,传递给被调用函数值。实参可以常量、变量、表达式、函数...
  • 形式参数是局部变量,局部变量中基础数据类型引用和值都存储在栈中,对象引用存在栈中,对象存在堆中。栈内存中局部变量随着方法消失而消失。 成员变量存储在堆中对象里面,由垃圾回收器负责回收。 ...
  • C 语言中有三个地方可以声明变量:在函数或块内部局部变量在所有函数外部全局变量形式参数的函数参数定义中让我们来看看什么局部变量、全局变量形式参数。局部变量在某个函数或块内部声明的变量称为局部...
  • 首先说明,"Java中基本... 形式参数局部变量 局部变量中 基础数据类型引用 和值都存储在栈中 局部变量中 对象引用存在栈中,对象实例存在堆中 栈内存中局部变量随着方法消失而消失。 成员变量存储在...
  • 比如说定义int *w 然后下边就可以用作w[i] 这么对吗? 对话在什么情况下可以这么使用? 答:不可以,因为w这时还是野指针。... 你追问那个红框框中问题不是指针与数组名问题,而是“形式参数”与“实际参数...
  • 就是将类型由原来具体类型参数化变成参数形式,然后在使用时传入具体类型。类似于方法中的变量参数。字我都认识,咋放在一起就看不懂了呢???Don't be afraid, I'm here.‘泛’,意为宽泛,普遍相对于...
  • 创建带参数方法时定义的参数叫形式参数,即形参;调用方法时传入参数叫实际参数,即实参。语法结构:// 有参方法[访问修饰符]返回值类型 方法名(参数列表){代码;return具体返回值;}复制代码参数传递:基本数据...
  • 1函数概述2函数定义的一般形式3函数参数和函数值3.1形式参数和实际参数3.2函数返回值4函数调用4.1函数调用一般形式4.2函数调用方式4.3被调用函数声明和函数原型4.4函数嵌套调用4.5函数递归调用5...
  • 题目要求:Date类要求可设定年月日可转换为字符串,并可指定分隔符,默认为’-’可获取若干天以前/后日期可计算与某个日期相隔天数,日期的形式可能日期对象,也可能代表年月日三个整数可与某个日期比较...
  • 两个项目,a,b 项目a新增、更新商品以表单形式提交,后端controller接收的时候,参数是商品对象,前面没有标签 项目b新增、更新商品利用angularjs的双向绑定,...@RequestParam不是在变量名不一致的时候使用的吗
  • 形式参数",用于定义方法时候使用参数,目的用来接收调用该方法时传递参数 特点 形参变量只有在被调用时才分配内存单元 在调用结束时,即刻释放所分配内存单元 因此,形参只在函数内部有效。 函数...
  • 顾名思义,就是将类型由原来具体类型参数化,类似于方法中的变量参数,此时类型也定义参数形式(可以称之为类型形参),然后在使用/调用时传入具体类型(类型实参)。 泛型本质为了参数化类型(在不创建...
  • 创建带参数方法时定义的参数叫形式参数,即形参;调用方法时传入参数叫实际参数,即实参。 语法结构: // 有参方法 [访问修饰符] 返回值类型 方法名(参数列表){ 代码; return 具体返回值; } 复制代码 ...
  • *和**有很多用途:(*)乘法运算符(或者在字符串情况下重复运算符)。... 但我认为问题几乎肯定与常见但最不期望地方有关(至少对于初学者来说):函数中的变量参数运算符和*出现在函数定义中 - 例如:def ...
  • 顾名思义,就是将类型由原来具体类型参数化,类似于方法中的变量参数,此时类型也定义参数形式(可以称之为类型形参),然后在使用/调用时传入具体类型(类型实参)。对于java中泛型它作用与使用方法你了解...
  • 嗨,你真懂this吗?

    2020-12-02 23:21:09
    听说你很懂this,的吗? 请先回答第一个问题:如何准确判断this指向的什么?【面试的高频问题】 ;margin-bottom:20px;" /> ——————————————————————————————...
  • 在默认情况下,参数是通过其位置进行匹配,从左到右,而且必须精确传递和函数头部参数名一样多参数。这种默认传递方式很简单def f(a,b,c):print(a,b,c)f(1,2,3)1 2 3python中可以使用基于关键字参数匹配...
  • 1.4 函数与预处理1.4.1 概述程序总是从main...1.4.2 定义函数一般形式1.4.3 形参和实参在定义函数时函数名后面括号中的变量名称为形参,在主函数中调用到该函数时,函数名后面括号中的参数称为实参。实参和形参...
  • 更先进一些的是变量的变量表示。请参考PHP手册。这在有时会显得很有用。 PHP内置了许多已定义的变量。你也可以用define函数定义你自己的常量,比如define("CONSTANT","value")。 2.6 运算符 PHP具有C,C++和Java中...
  • *和**有很多用途:(*)乘法运算符(或者在字符串情况下重复运算符)。... 但我认为问题几乎肯定与常见但最不期望地方有关(至少对于初学者来说):函数中的变量参数运算符和*出现在函数定义中 - 例如:def ...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    这样合法的和可移植的吗? 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1却明确说明不能这样做? 2.9 为什么不能用内建的==和!=操作符比较结构? 2.10结构传递和返回如何实现的? 2.11 ...
  • 栈内存的变量必须声明定义赋值后才可以使用;堆内存中的变量是有默认值。 举例子如下; 2:形式参数 3:匿名对象 问题:匿名对象有什么好处吗? 可以提高内存使用效率,匿名对象调用完毕就是...
  • 触发script元素上error事件, 后面带的参数是回调函数接收参数 abort = function (errorType) { $(script).triggerHandler('error', errorType || 'abort') }, xhr = { abort: abort...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 263
精华内容 105
关键字:

形式参数是定义变量的吗