关于c++变量作用域问题-在一个for循环体中定义的变量-外部怎么用
高洛峰
高洛峰 2017-04-17 14:19:26
0
5
841
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(5)
阿神

首先回答您的問題:循環內部(也就是大括號內部)定義的變量,在外部是無法被使用的。而且編譯的時候,會告訴您,此變數沒有定義。
原因在花括號外部使用內部定義的變量,已經超出了變數的作用域。
下面簡單介紹下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. 以上是本人的淺薄經驗,在此分享。如有錯誤請指正。有些東西,寫的多了,就會體會到。
PHPzhong

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

PHPzhong

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

Peter_Zhu

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

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

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

不能,違反作用於規則

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!