拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
首先回答您的問題:循環內部(也就是大括號內部)定義的變量,在外部是無法被使用的。而且編譯的時候,會告訴您,此變數沒有定義。 原因:在花括號外部使用內部定義的變量,已經超出了變數的作用域。 下面簡單介紹下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,變數的宣告是在作用域或函數的起始部分。個人建議,統一放在函數的起始部分。 優點
C/C++
只能在循環體外部定義,如果不想將z暴露在循環體外,可以用{}包住兩個循環體,並在{}中定義z
z
{}
不知道有什麼辦法可以在另一個循環中,使用上一個循環中定義的變量, 也不建議這麼用,如果代碼比較多, 會比較亂
讓變數z在下一個迴圈中使用嗎?
先說說我對變數使用的理解變數實際上對應的是記憶體中的一塊空間,機器底層根本不知道有什麼變數名,有的只是記憶體位址。 我們使用變數要嘛取值,要嘛賦值,也就是記憶體的讀寫
{ int z = 0; // 假设 z 对应的内存为 A } z = 1; // 这里z能不能使用? 这里能不能往A中写1 // 答案是否定的 //虽然你感觉两个变量都是z,他们应该代表的是同一个内存 //但,实际上面代码和下面代码是等同的 { int z = 0; } a = 1;
不能,違反作用於規則
首先回答您的問題:循環內部(也就是大括號內部)定義的變量,在外部是無法被使用的。而且編譯的時候,會告訴您,此變數沒有定義。
原因:在花括號外部使用內部定義的變量,已經超出了變數的作用域。
下面簡單介紹下C/C++花括號作用域
花括號作用域
從上面程式碼區塊兒,可以看到,
作用域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語句的時候,很容易就跳過了某些變數的聲明。
便於變數的多次有效利用,也就是,一次聲明,多次初始化,多次利用。
方便閱讀..-
以上是本人的淺薄經驗,在此分享。如有錯誤請指正。有些東西,寫的多了,就會體會到。
只能在循環體外部定義,如果不想將
z
暴露在循環體外,可以用{}
包住兩個循環體,並在{}
中定義z
不知道有什麼辦法可以在另一個循環中,使用上一個循環中定義的變量, 也不建議這麼用,
如果代碼比較多, 會比較亂
讓變數z在下一個迴圈中使用嗎?
先說說我對變數使用的理解
變數實際上對應的是記憶體中的一塊空間,機器底層根本不知道有什麼變數名,有的只是記憶體位址。
我們使用變數要嘛取值,要嘛賦值,也就是記憶體的讀寫
不能,違反作用於規則