精华内容
下载资源
问答
  • 譬如全局变量作用域为整个文件(准确的说是定义该全局变量的文件中该变量定义/声明之后的部分。只不过一般情况下全局变量都在文件头部定义,因此说全局变量为文件作用域。),局部变量为代码块作用域。所谓代码块作用...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    深度解析:

    C语言中有“作用域”的概念。譬如全局变量作用域为整个文件(准确的说是定义该全局变量的文件中该变量定义/声明之后的部分。只不过一般情况下全局变量都在文件头部定义,因此说全局变量为文件作用域。),局部变量为代码块作用域。

    所谓代码块作用域,代码块是指用一对大括号{}括起来的部分(譬如一个函数的函数体,for循环的循环体等)。也就是说局部变量的作用域其实是定义这个局部变量的代码块中该变量定义体之后的部分。

    这样看来,至少得到以下两个结论:

    l 变量的作用域是有大有小的

    l 变量的作用域是有重叠部分的。譬如在一个函数内,该函数的局部变量和整个文件的全局变量都覆盖这个作用域,这就是作用域的重叠。

    重叠作用域中,如果全局变量名和局部变量名不同不会造成困扰。因为我们可以很容易的通过变量名来区分两个变量(我们班有个叫旺财的,别人班有个叫富贵的,我叫旺财你肯定知道我要找的是谁吧!)。但是在两个变量名相同时要怎么办呢(我们班有个旺财,隔壁班也有个旺财,我在走廊里喊一声旺财,你觉得我在叫谁···)?

    这种情况逻辑学上叫二义性(ambiguity)。即有两种可能的解释,却没有任何区分的方法。怎么办呢?人为规定嘛。C语言规定:在变量作用域重叠时,作用域为小范围的变量覆盖大范围的变量。譬如函数内有个局部变量var,文件内有个全局变量var。则在该函数内部(准确的说是函数内部var局部变量定义体之后的部分),你使用var访问的是var局部变量,此处全局变量var被掩蔽(要想在此处访问全局变量var,对于C++可以使用::符号,而C语言中则没有域操作符::)。

    代码如下:

    #include

    int var = 7; // 全局变量var

    void func1(void)

    {

    printf("In func1, var = %d.\n", var);

    }

    void func2(void)

    {

    int var = 5;

    printf("In func1, var = %d.\n", var);

    }

    void func3(void)

    {

    int var = 5;

    #ifdef __cplusplus

    printf("__cplusplus defined.\n");

    printf("In func1, var = %d.\n", ::var);

    #endif

    }

    int main(void)

    {

    func1();

    func2();

    func3();

    return 0;

    }

    /*

    * gcc编译,执行结果:

    * In func1, var = 7.

    * In func1, var = 5.

    *

    * 结论:在line13中,func2中局部变量var屏蔽了全局变量var。

    *

    * g++编译,执行结果:

    * In func1, var = 7.

    * In func1, var = 5.

    * __cplusplus defined.

    * In func1, var = 7.

    */

    展开全文
  • C++中局部变量可以和全局变量重名 最近遇到一道题,全局变量和局部变量重名,如何把全局变量赋值为局部变量? 对于重名,显然是局部 覆盖 全局。但是这时使用全局变量到时没有涉及过。 对于c++而言,在...

    C++中局部变量可以和全局变量重名


    最近遇到一道题,全局变量和局部变量重名,如何把全局变量赋值为局部变量?

    对于重名,显然是局部 覆盖 全局。但是这时使用全局变量到时没有涉及过。


    对于c++而言,在全局和局部重名时,直接使用变量名是局部变量,用 :: 来使用全局变量。

    例子:

    #include <iostream>
    using namespace std;
    
    
    int x = 0;
    int main()
    {
    	int x = 1;
    	cout<<x<<endl;
    	cout<<::x<<endl;
    	///局部赋值给全局
    	::x = x;
    	cout<<x<<endl;
    	cout<<::x<<endl;
    	
    	return 0;
    }


    展开全文
  • 局部变量能否和全局变量重名

    千次阅读 2019-09-16 09:53:33
    1、局部变量能否和全局变量重名?  答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: " (域解析符)  局部变量可以全局变量同名,在函数内引用这个变量,会用到同名的局部变量,而不会用到全局变量。...

    1、局部变量能否和全局变量重名?   

      答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: " (域解析符)

        局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 

    2、如何引用一个已经定义过的全局变量?   

      答:可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。 


    3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?  

      答:可以,在不同的C文件中以static形式来声明同名全局变量。前提是只能有一个C文件中对此变量赋初值,连接才不会出错 
     

    展开全文
  • C++中局部变量可否与全局变量重名

    千次阅读 2019-01-19 14:11:31
    此问题研究的是变量的作用域的问题。一个声明将一个名字引进一个作用域;局部变量(通常在函数中定义)的作用域是...与全局变量重名局部变量可以屏蔽全局变量,如果想在块内使用全局变量需要通过作用域解析运算符...

            此问题研究的是变量的作用域的问题。一个声明将一个名字引进一个作用域;局部变量(通常在函数中定义)的作用域是从声明的那一点开始,直到这个声明所在的块结束为止(一个块就是由{}围起来的一段代码)。全局变量(在所有函数、类、命名空间之外定义)的作用域从声明的那一点开始,直到这个声明所在的文件的结束。与全局变量重名的局部变量可以屏蔽全局变量,如果想在块内使用全局变量需要通过作用域解析运算符::引用。

            C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。

    1.  从作用域看:

           全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

           静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

           局部变量也只有局部作用域,它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

           静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

       2.从分配内存空间看:
           全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在里分配空间。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

        (1)静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
        (2)变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

    Tips:
      A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
      B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
      C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
           D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
          E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

    static 全局变量:改变作用范围,不改变存储位置

    static 局部变量:改变存储位置,不改变作用范围

    静态函数 :在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

           如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数也称为内部函数。定义一个内部函数,只需在函数类型前再加一个“static”关键字即可

    展开全文
  • 局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以全局变量同名,在函数内引用这个变量,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同...
  • /**********************************************...*函数内部定义的局部变量与全局变量重名时,函数在使用该变量的时候会以局部变量覆盖全局变量,也就是只有局部变量会起效果。 ********************************...
  • 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ; 局部变量可以全局变量同名, 在函数内引用这个变量,会用到同名的局部变量,而不会用到全局变量。对于有些编译器 而言...
  • 局部变量可以与全局变量同名,在函数内引用这个变量,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,...
  • 当局部变量全局变量重名的时候,局部会屏蔽全局变量,如果需要使用全局变量,需要使用“::"。 局部变量可以全局变量同名,在函数内引用这个变量,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而...
  • C++中局部变量可以和全局变量重名吗? 这是一个作用域的问题。一个声明将一个名字引进一个作用域;局部变量(通常在函数中定义)的...与全局变量重名局部变量可以屏蔽全局变量,如果想在块内使用全局变量需要通
  • 局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以全局变量同名,在函数内引用这个变量,会用到同名的局部变量,而不会用到全局变量。对于有些编译器...
  • 局部变量能否和全局变量重名???

    千次阅读 2015-02-22 13:17:46
    这个问题, 网上回答的都是一致的, 因为大部分只是专业性的描述答案, 并且都是对理解方面比较抽象, 以下的这些答案内容分析是个人的一些理解然后编辑而成, 如果不全面或者... 局部变量可以与全局变量同名, 在函数内引用
  • 局部变量可以与全局变量同名。在函数内引用这个变量,会用到同名的局部变量,而不会用到全局变量。要用全局变量,需要使用"::"。 对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环...
  • //局部变量就是私有的变量2、全局变量://就是定义在函数外部的变量(外部变量),//全局变量起作用的范围是当前文件中的所有函数。//全局变量就是所有函数共享的变量三、代码示例1、局部变量...
  • 全局变量与局部变量重名的情况

    千次阅读 2020-03-04 23:15:12
    当全局变量局部变量出现重名时, 在局部变量作用域内,全局变量失效
  • 全局变量在JavaScript中定义变量,在当前script标签中,若在定义该变量前去调用该变量,值是undefined,而在没有定义该变量就去调用该变量是会报错的。原因是所有定义的变量都是先在内存中开辟该变量的存储...
  • 函数内部定义的局部变量与全局变量重名时,函数在使用该变量的时候会以局部变量覆盖全局变量。也就是只有局部变量会起效果。在此定义域中赋值等操作都不会使用到全局变量。 在main函数或其他函数里定义了局部变量...
  • 这是一个作用域的问题。...与全局变量重名局部变量可以屏蔽全局变量,如果想在块内使用全局变量需要通过作用域解析运算符::引用。 见下例: //global_local.cpp #include using namespace std; i

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,505
精华内容 7,002
关键字:

当局部变量与全局变量重名时