首頁  >  問答  >  主體

关于c++变量作用域问题-在一个for循环体中定义的变量-外部怎么用

高洛峰高洛峰2714 天前803

全部回覆(5)我來回復

  • 阿神

    阿神2017-04-17 14:21:26

    首先回答您的問題:循環內部(也就是大括號內部)定義的變量,在外部是無法被使用的。而且編譯的時候,會告訴您,此變數沒有定義。
    原因在花括號外部使用內部定義的變量,已經超出了變數的作用域。
    下面簡單介紹下C/C++花括號作用域

    花括號作用域

    //作用域,可以看作一个变量的有效使用区域
    
    //函数外部也是一个大的作用域,暂且记作:作用域0
    void Fun()
    {
        //函数内部作用域,暂且记作:作用域1
        
        while()
        {
            //循环内部,暂且记作:作用域2
             if()
            {
                //if内部,也是一个作用域,暂且记作:作用域3
            }
        }
        
        if()
        {
            //if内部,也是一个作用域,暂且记作:作用域4
        }
        
        {
            //我只写个花括号,这个也是一个作用域,暂且记作:作用域5
        }
    }

    從上面程式碼區塊兒,可以看到,
    作用域0,直接包含作用域1,同時,又間接包含作用域2、3、4、5;(作用域1中聲明的變量,可以在其本身,以及2、3、4、5中使用,但是不能在1的上級作用域使用,也就是作用域0,函數外部。 、5,同時,又間接包含作用域3;(作用域2中聲明的變數可以在作用域2,以及2的下一級作用域3中使用,但是不能在0、1、4、5中使用。

    也就是說,只能在目前作用域或子級作用域下面使用。 變數的宣告的位置

    下面,簡單說一下

    中的變數宣告。

    C/C++標準的C
    中,有嚴格的規範,變數的聲明必須在作用域的起始部分。 (如有程式碼疑問,可能是您在C++中把C混淆了,或者您的編譯器的標準不嚴格。嚴格的一般應該是linux或unix下的C標準。)甚至,函數內部的所有變數聲明,都人為的嚴格要求在函數起始部分,防止變數的隨處宣告和定義。 (這一點,可能和您的老師或師傅,以及有的書本中,影片中描述的不一樣,那是因為現在多數程式語言已經不這麼要求,而他們混淆了規則。)請記住,嚴格的標準的C,變數的宣告是在作用域或函數的起始部分。個人建議,統一放在函數的起始部分。
    優點

      開發階段,一般有的函數體很龐大(遇到這種情況,一般是函數的設計問題,但也不排除必要性。)面對如此龐大的函數體,變數的宣告統一在函數起始位置,可以防止變數使用的時候,不聲明,尤其使用goto語句的時候,很容易就跳過了某些變數的聲明。
    1. 便於變數的多次有效利用,也就是,一次聲明,多次初始化,多次利用。
    2. 方便閱讀..
    3. 以上是本人的淺薄經驗,在此分享。如有錯誤請指正。有些東西,寫的多了,就會體會到。

    回覆
    0
  • PHPz

    PHPz2017-04-17 14:21:26

    只能在循環體外部定義,如果不想將z暴露在循環體外,可以用{}包住兩個循環體,並在{}中定義z

    回覆
    0
  • PHPz

    PHPz2017-04-17 14:21:26

    不知道有什麼辦法可以在另一個循環中,使用上一個循環中定義的變量, 也不建議這麼用,
    如果代碼比較多, 會比較亂

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:21:26

    讓變數z在下一個迴圈中使用嗎?

    先說說我對變數使用的理解
    變數實際上對應的是記憶體中的一塊空間,機器底層根本不知道有什麼變數名,有的只是記憶體位址。
    我們使用變數要嘛取值,要嘛賦值,也就是記憶體的讀寫

    {
        int z = 0;  // 假设 z 对应的内存为 A
    }
        z = 1; // 这里z能不能使用? 这里能不能往A中写1
               // 答案是否定的
        //虽然你感觉两个变量都是z,他们应该代表的是同一个内存
        //但,实际上面代码和下面代码是等同的  
    {
        int z = 0;  
    }
        a = 1;      

    回覆
    0
  • 黄舟

    黄舟2017-04-17 14:21:26

    不能,違反作用於規則

    回覆
    0
  • 取消回覆