精华内容
下载资源
问答
  • 在任何一种编程语言中,作用域程序中定义的变量所存在的区域,超过该区域的变量就不能被访问。我相信很多初学者对于作用域不太了解,作用域没有被老师或者教程详细的讲解,导致对于作用域的认识不太清晰。下面将会...

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

    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.4 函数与预处理1.4.1 概述程序总是从main...1.4.2 定义函数的一般形式1.4.3 形参和实参在定义函数时函数名后面括号中的变量名称为形参,在主函数中调用到该函数时,函数名后面括号中的参数称为实参。实参和形参...

    1.4 函数与预处理

    68da275ec52b363b37cf207fafaab53c.png

    1.4.1 概述

    程序总是从main函数开始执行。关键字void表示本函数没有返回值,是空类型。函数不能嵌套调用,但互相之间可以调用(main函数不能被调用)。在使用函数前一定要进行声明,除非函数的定义在其使用之前。

    1.4.2 定义函数的一般形式

    c3514b8e7aa6dd8834f80b5d2120e202.png

    1.4.3 形参和实参

    在定义函数时函数名后面括号中的变量名称为形参,在主函数中调用到该函数时,函数名后面括号中的参数称为实参。实参和形参间的数据传递是单向的,只能由实参传给形参。在编译时,二者的存储单元是不同的单元。调用结束后,形参单元释放,实参单元仍保留原值。实参与形参的个数要匹配,它们按照顺序,一对一地传递数据。

    函数的返回值通过函数中的return语句获得。

    1.4.4 函数的调用和声明

    函数名(实参列表); //函数调用的一般格式

    在一个函数中调用另一个函数所需要的条件:(1)被调用的函数必须是已经存在的函数(是库函数或者用户自己定义的函数)。(2)当使用自己定义的函数,且该函数与调用它的函数在同一个程序单位内,若函数定义在函数调用之后,则需在调用该函数之前对它做声明。如果被调用的函数的定义出现在主调函数之前,可以不必加声明。函数声明只比函数定义的首部多一个分号。

    Eg:

    int main()

    {

    int max(int x, int y);//对max函数作声明

    int a,b;

    max(a,b)

    }

    int max(int x,int y)//定义max函数

    {……}

    其中int max(int x, int y);是对被调用的max函数作声明,在函数声明中也可以不写形参名,而只写形参的类型,如:

    int max(int , int );

    这种函数声明称为函数原型。函数原型的一般形式有以下几种:

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

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

    由于编译系统不检查参数名,因此参数名是什么都无所谓,但是第一种是基本形式。

    1.4.5 内置函数

    06b46ce262b3aaf8d1f9b581d7026716.png

    C++提供一种高效率的方法,即在编译时将锁掉用的函数的代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为内置函数。只需在函数首行左端加一个关键字inline即可。内置函数不能包括复杂的控制语句,如循环语句和switch语句。

    Eg:

    inline int max(int,int);//声明内置函数max

    int main()

    {

    int a,b;

    max(a,b)

    }

    inline int max(int x,int y)//可以同时加inline,也可以仅在声明时加inline,效果是一样的

    {……}

    1.4.6 函数的重载(静态多态性、静态关联)

    C++允许使用同一个函数名定义多个函数,这些函数的参数个数和参数类型不同,这就是函数的重载。即对一个函数名赋予新的意义,是一个函数名可以多用。运算符重载本文中不再赘述,详情可参考《C++程序设计》第10章。函数的重载还是静态多态性的一种体现,多态性将在后面的章节中讲到。

    例 1.4.1

    参数类型不同的情况

    例 1.4.1a 求三个数中的最大数(分别考虑整数、双精度数和长整数的情况)

    #include

    using namespace std;

    int main()

    {

    int max(int a,int b,int c);

    double max(double a,double b,double c);

    long max(long a,long b,long c);

    int i,i1,i2,i3;

    cin>>i1>>i2>>i3;

    i=max(i1,i2,i3);

    cout<

    double d,d1,d2,d3;

    cin>>d1>>d2>>d3;

    d=max(d1,d2,d3);

    cout<

    long g,g1,g2,g3;

    cin>>g1>>g2>>g3;

    g=max(g1,g2,g3);

    cout<

    }

    int max(int a,int b,int c)

    {

    if(b>a) a=b;

    if(c>a) a=c;

    return a;

    }

    long max(long a, long b, long c)

    {

    if(b>a) a=b;

    if(c>a) a=c;

    return a;

    }

    double max(double a, double b, double c)

    {

    if(b>a) a=b;

    if(c>a) a=c;

    return a;

    }

    参数个数不同的情况

    例 1.4.1b 写一个程序,用来求2个整数或者3个整数中的最大值。

    #include

    using namespace std;

    int main()

    {

    int max(int a,int b,int c);//函数声明

    int max(int a,int b);

    int a=8,b=-12,c=27;

    cout<

    cout<

    }

    int max(int a,int b,int c)

    {

    if(b>a) a=b;

    if(c>a) a=c;

    return a;

    }

    int max(int a,int b,)

    {

    if (a>b)

    return a;

    else returnb;

    }

    1.4.7 函数模版

    函数的重载在程序中仍然需要分别定义每一个函数,比较麻烦。为了解决这个问题,,可以使用函数模版。所谓函数模版,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。凡是函数体相同的函数均可使用该模版,不必再定义多个函数。在调用时,系统会根据实参类型取代模版中的虚拟类型。函数模版可以很好的解决函数重载中的参数类型不同的情况时的简化。

    d3af799d1abd68cf1631cacf3db12a21.png

    定义函数模版的一般形式为:

    template

    例 1.4.1 a可以改写如下:

    #include

    using namespace std;

    template

    T max(T a,T b,T c)

    {

    if(b>a) a=b;

    if(c>a) a=c;

    return a;

    }

    int main()

    {

    int i1=185,i2=-76,i3=567,I;

    double d1=56.87,d2=90.23,d3=-3214.78,d;

    long g1=67854,g2=-912456,g3=673456,g;

    i=max(i1,i2,i3);

    d=max(d1,d2,d3);

    g=max(g1,g2,g3);

    cout<

    cout<

    cout<

    return 0;

    }

    1.4.8 有默认参数的函数

    C++提供了一个简单的方法,给形参一个默认值,这样形参就不一定要从实参取值了。若例1.4a的函数声明如下:

    int max(int a,int b=10,int c=5);//表示指定b的默认值为10,c的默认值为5

    若有多个形参,可以使每一个形参都有一个默认值,也可以只对其中一部分形参指定默认值。

    当调用函数时:max(8)相当于max(8,10,5),max(11,3)相当于max(11,3,5)。实参与形参的结合是从左至右的,因此指定默认值的参数必须放在形参列表的最右端。

    int max(int a=10,int b,int c=5);//错误,默认参数必须在最右端

    使用带默认参数的函数时要注意以下2点:①若函数定义在函数调用之前,则在函数定义中需给出默认值。如果函数定义在函数调用之后,则需在函数调用前声明带默认值的函数。②一个函数不能既作为重载函数,又作为有默认参数的函数。

    1.4.9 函数的嵌套调用和递归调用

    C++不允许在一个函数中完整地包含另一个函数,这个叫嵌套定义。但是C++允许嵌套调用,即在调用一个函数的过程中,又调用另一个函数,如图1.2。

    fac03700703484a3a93a547a0a5dd72a.png

    图 1.2 两层嵌套调用

    在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。包含递归调用的函数称为递归函数。

    Eg:

    int f(int x)

    {

    int y,z;

    z=f(y); //在调用函数f的过程中,又要调用f函数

    return(2*z);

    }

    程序中出现的递归调用次数应该是邮箱的,这可以通过if语句来控制,当满足某一条件是才执行递归调用,否则不再继续。

    例 1.4.2

    用递归法求n!。

    分析:和,可以得到下面的递推公式

    e6727e21f6e0d8a088dcd74dfefa191e.gif

    则程序如下:

    #include

    using namespace std;

    long fac(int); //函数声明

    int main()

    {

    int n;//为所求的阶乘

    long ;//用来存放n的阶乘

    cout<

    cin>>n;

    y=fac(n);

    cout<

    return 0;

    }

    long fac(int a) //定义阶乘函数

    {

    long f;

    if (n<0)

    {

    cout<

    f=-1;

    }

    else if (n==0||n==1) f=1;

    else f=fac(n-1)*n;//n>1时,进行递归调用

    return f;

    }

    1.4.10 全局变量、局部变量以及变量的存储类别

    643422475fa870c96fd9f1ec37074cad.png

    例 1.4.3 下列程序输出什么。

    #include

    using namespace std;

    int f(int a)

    {

    auto int b=0;//定义b为自动变量

    static int c=3;//定义c为静态局部变量

    b=b+1;

    c=c+1;

    return a+b+c;

    }

    int main()

    {

    int a=2,i;

    for (i=0;i<3;i++)

    cout<

    cout<

    return 0;

    }

    运行结果为:7 8 9

    一个C++程序可以由多个源程序文件组成,若在两个文件中要用到同一个外部变量num,则不能在两个文件中个自定义num。正确的做法是:在一个文件中定义外部变量num,在另一个文件中用extern对num作外部变量声明。若希望变量num仅能被本文件引用而不能被其他文件引用,需在定义外部变量时加static。这样即便另一个文件中有extern int num,它也无法使用num(用static声明静态外部变量)。

    1.4.11 内部函数和外部函数

    2846ad0fff7ce7aed0bd7fcdaed27264.png

    例 1.4.4 输出两个整数的最大值,用外部函数实现。

    file1.cpp

    #include

    using namespace std;

    int main()

    {

    extern int max(int,int);

    //声明在本函数中将要调用其他文件中定义的max函数

    int a,b;

    cin>>a>>b;

    cout<

    }

    file2.cpp

    int max(int x,int y)

    {

    z=x>y? x:y;

    return z;

    }

    总结一下extern关键字和static关键字的功能:

    static:声明静态局部变量,声明静态外部变量,声明内部函数。

    extern:声明全局变量,声明外部函数。

    1.4.12 预处理命令

    72ee973dc57c2078fb9a5a56afa5872d.png

    一、宏定义

    一般形式:

    #define 标识符 字符串

    #define PI 3.1415926

    #define宏名(参数表) 字符串

    #define S(a,b) a*b

    二、文件包含

    #include”file1.cpp”。

    #include和#include”文件名”的区别:

    用尖括号时,系统到系统目录中寻找要包含的文件,如果找不到则编译系统会报错。系统目录指的是存放C++系统的目录。一般情况下,库函数和C++编译系统是存放在同一个目录下的。因此如果要包含的是C++系统提供的头文件,宜采用这种形式。

    如果用户自己编写的文件往往存放在自己指定的目录中,此时用双撇号形式,在双撇号中给出文件路径和文件名。这样编译系统会先在该目录下寻找该文件,若果找不到,再到系统目录中去寻找。其实做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要这里我要推荐c++交流群648,778,840,不管你是小白还是大牛欢迎入住,大家一起交流成长。

    学习思路:

    fa14f68326ee046abe1a96ed3ed94004.png

    学习资料:

    c9f4b0f1f2e72eab46e1ef5a6d0f9637.png
    展开全文
  • 类成员主要包括成员变量和成员方法。...基本数据类型做参数时,传递的值,不能出方法的范围 引用数据类型做参数时,传递的地址,可以影响方法外部 特殊:String做参数时,等同于基本数据类型。 方法重载 方法重载.

    在这里插入图片描述
    类成员主要包括成员变量和成员方法。 带参数的成员方法 带参数的成员方法可以接受用户输入的内容。创建带参数的方法时定义的参数叫形式参数,即形参;调用方法时传入的参数叫实际参数,即实参。 语法结构:

    // 有参方法
    [访问修饰符] 返回值类型 方法名(参数列表){
    		代码;
    		return 具体的返回值;
    	}
    复制代码

    参数传递:

    基本数据类型做参数时,传递的是值,不能出方法的范围 引用数据类型做参数时,传递的是地址,可以影响方法外部 特殊:String做参数时,等同于基本数据类型。

    方法重载

    方法重载是指在一个类中定义多个同名的方法,每个方法的参数列表不同。 方法重载其实是对原有方法的一种升级,可以根据参数的不同,采用不同的实现方法,而且不需要编写多个名称,简化了类调用方法的代码。
    重载的方法必须在同一个类中 方法名相同 参数列表不同(不包含参数名不同) 方法的重载与访问修饰符和返回值类型无关

    成员变量

    类中的属性,也就是直接在类中定义的变量称作成员变量,它定义在方法外面。 局部变量就是定义在方法中的变量;一般情况下,局部变量在使用前需要赋值,否则会编译出错。

    成员变量和局部变量的区别

    作用域不同。局部变量的作用域仅限于定义它的方法,在该方法外无法访问它;成员变量的作用域在整个类内部都是可见的,所有成员方法都可以使用它,如果访问权限允许,还可以在类外部使用成员变量 初始值不同。成员变量在定义时可以不初始化,Java会给成员变量赋初始值;但是Java不会给局部变量赋初始值,因此在定义局部变量时必须初始化后再使用 在同一个方法中,不允许有同名的局部变量,在不同的方法中可以有同名的局部变量 局部变量可以和成员变量同名,并且在使用时,局部变量具有更高的优先级

    构造方法

    Java中,当类创建一个对象时会自动调用该类的构造方法,构造方法分为默认构造方法和带参数的构造方法。 构造方法的主要作用是进行一些数据的初始化;定义构造方法的语法格式:

    // 构造方法
    访问修饰符 方法名([参数列表]){
    		初始化代码;
    	}
    复制代码

    构造方法没有返回值 默认构造方法没有参数,因此参数列表可选 构造方法的方法名与类名相同 如果自定义了一个或多个构造方法,中 Java不会自动添加默认的构造方法;此时若还想使用默认构造方法,则需要手动写出默认构造方法。

    this关键字

    this 关键字是对一个对象的默认引用。 this 的使用: (1)调用成员变量;在方法中调用成员变量,若局部变量和成员变量同名,则需要通过 this 关键字区分成员变量和局部变量

    // this关键字调用成员变量
    public void setName(String name){
    	this.name=name;
    }
    public void setName(String xm){
    	name=xm;
    }
    复制代码

    当成员变量和局部变量同名时,必须使用 this 关键字,这里 this. 后面指的是成员变量 当成员变量和局部变量不同名时,this 关键字可以省略

    (2)使用 this 调用成员方法

    // this关键字调用成员方法
    public void setName(String name){
    	this.name=name;
    }
    public void setName(String xm){
    	this.setName();
    }
    复制代码

    调用方法时,this 关键字可以省略 (3)使用 this 关键字调用重载的构造方法,只能在构造方法中使用,且必须是构造方法的第一条语句

    // this关键字调用构造方法
    public void Penguin(String name,String sex){
    	this.name=name;
    	this.sex=sex;
    }
    public void Penguin(String name,int health,int love,String sex){
    	this(name,sex);
    	this.health=health;
    	this.love=love;
    }
    复制代码

    最后

    感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

    展开全文
  • 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 34 存储类型 35 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 35 1.11 extern在函数声明中什么...
  • 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 存储类型 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 1.11 extern在函数声明中什么意思? 1.12 ...
  • 6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢?  数组不能被赋值  6.5 为什么不能这样向数组赋值?externchar*getpass();charstr[10];str=getpass("Enterpassword:");  6.6 既然不...
  • 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 存储类型 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 1.11 extern在函数声明中什么意思? 1.12 ...
  • 6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢? 数组不能被赋值 6.5 为什么不能这样向数组赋值?externchar*getpass();charstr[10];str=getpass("Enterpassword:"); 6.6 既然不能向...
  •  6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢? 数组不能被赋值 6.5 为什么不能这样向数组赋值?externchar*getpass();charstr[10];str=getpass("Enterpassword:"); 6.6 既然不能...
  • 6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢? 65 数组不能被赋值 66 6.5 为什么不能这样向数组赋值?extern char *getpass(); char str[10]; str=getpass(Enter password:); 66 ...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 5 存储类型 6 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 6 1.11 extern在函数声明中什么...
  • o 4.10 如果我不使用表达式的值, 我应该用 ++i 或 i++ 来自增一个变量吗? o 4.11 为什么如下的代码 int a = 100, b = 100; long int c = a * b; 不能工作? o 4.12 我需要根据条件把一个复杂的表达式赋值给两个...
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...
  • 7.7.2 什么实例变量(Instance Variable) 177 7.8 this关键字:指向对象自己的引用 177 7.8.1 发现问题:当实例变量和局部变量重名 177 7.8.2 经常深藏不露的this关键字 178 7.8.3 在方法中调用方法 179 7.9...
  • 7.7.2 什么实例变量(Instance Variable) 177 7.8 this关键字:指向对象自己的引用 177 7.8.1 发现问题:当实例变量和局部变量重名 177 7.8.2 经常深藏不露的this关键字 178 7.8.3 在方法中调用方法 179 7.9...
  • 7.7.2 什么实例变量(Instance Variable) 177 7.8 this关键字:指向对象自己的引用 177 7.8.1 发现问题:当实例变量和局部变量重名 177 7.8.2 经常深藏不露的this关键字 178 7.8.3 在方法中调用方法 179 7.9...
  • 2-11 在一个for循环中,可以初始化多个变量吗?如何实现? 解: 在for循环设置条件的第一个";"前,用,分隔不同的赋值表达式。 例如: for (x = 0, y = 10; x ; x++, y++) 2-12 执行完下列语句后,n的值为多少? ...
  • JavaScript王者归来

    2013-01-10 11:30:48
    2.1.4 拿来主义--引入外部的JavaScript文件 2.2 赏心悦目的特效 2.2.1 生命在于运动--DHTML的效果 2.2.2 换一种风格--CSS的力量 2.2.3 用JavaScript操作DOM--一个可拖动窗口的例子 2.3 使用JavaScript来与用户交互 ...
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    3.4 这个巧妙的表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可 以交换a 和b 的值。. . . . . . . . . . . . . . . . . . . . . . . . . 14 3.5 我可否用括号来强制执行我所需要的计算顺序? . . . . . . . . ....
  • Visual C++ 2008入门经典--详细书签版

    热门讨论 2013-02-02 16:07:15
    7.7.2 类外部的成员函数定义 318 7.8 类对象的数组 319 7.9 类的静态成员 321 7.9.1 类的静态数据成员 321 7.9.2 类的静态函数成员 323 7.10 类对象的指针和引用 324 7.10.1 类对象的指针 324 7.10.2 类对象...
  • 7.7.2 类外部的成员函数定义 318 7.8 类对象的数组 319 7.9 类的静态成员 321 7.9.1 类的静态数据成员 321 7.9.2 类的静态函数成员 323 7.10 类对象的指针和引用 324 7.10.1 类对象的指针 324 7.10.2 类对象...

空空如也

空空如也

1 2
收藏数 23
精华内容 9
关键字:

形参是外部变量吗