規定“所有用到的變數要先定義後使用”,編譯器處理起來比較方便,不會有歧義。
因為 C++ 裡面,相同名字的變數在【不同的作用域】裡面,是可以重複宣告的。
注:每一對"{}"就是一個作用域。
比如下面的程式是可以編譯透過的:
#include
using namespace std;
int main(int argc, char *argv[])
// 作用域 1 開始
{
int a = 1;
// 作用域 2 開始
cout
int a = 2;
// 作用域 3 開始
int a = 3;
// 作用域 4 開始
int a = 4;
}
return 0;
輸出結果為:
1
2
3
4
--------------------------------------------------------------------------------
如果【沒有】規定“所有用到的變數要先定義後使用”,上面的程式會怎麼樣呢?
那麼上面這個程式就亂套了。因為可以先使用,再定義,
輸出語句1~4 就不知道自己該用哪個變數 a 了(這裡有4個不同的 a)。
因為不需要“先定義,後使用”,輸出語句1~4可以使用定義在任何地方的哪個變數 a 。
這樣,編譯器就無法確定,也就無法編譯了。
如果規定“所有用到的變數要先定義後使用”,上面的程式會怎麼樣呢?
那麼上面這個程式可以正常執行:
1)在輸出語句1的位置為止,只有【作用域 1 】定義了一個 a : int a=1 ,因此輸出 1 。
2)在輸出語句2的位置為止,【作用域 1 】和【作用域 2】分別定義了一個 a :
int a=1 ;
int a=2 ;
根據就近原則,使用最內層作用域的 a ,【作用域 2】裡面的 a ,輸出 2 ;
3)在輸出語句3的位置為止,【作用域 1 】【作用域 2】和【作用域 3】分別定義了一個 a :
int a=3 ;
根據就近原則,使用最內層作用域的 a ,【作用域 3】裡面的 a ,輸出 3 ;
同理可以分析輸出語句4。
這就是為什麼規定“所有用到的變數要先定義後使用”的原因之一吧。
規定“所有用到的變數要先定義後使用”,編譯器處理起來比較方便,不會有歧義。
因為 C++ 裡面,相同名字的變數在【不同的作用域】裡面,是可以重複宣告的。
注:每一對"{}"就是一個作用域。
比如下面的程式是可以編譯透過的:
#include
using namespace std;
int main(int argc, char *argv[])
// 作用域 1 開始
{
int a = 1;
// 作用域 2 開始
{
cout
int a = 2;
// 作用域 3 開始
{
cout
int a = 3;
// 作用域 4 開始
{
cout
int a = 4;
cout
}
}
}
return 0;
}
輸出結果為:
1
2
3
4
--------------------------------------------------------------------------------
如果【沒有】規定“所有用到的變數要先定義後使用”,上面的程式會怎麼樣呢?
那麼上面這個程式就亂套了。因為可以先使用,再定義,
輸出語句1~4 就不知道自己該用哪個變數 a 了(這裡有4個不同的 a)。
因為不需要“先定義,後使用”,輸出語句1~4可以使用定義在任何地方的哪個變數 a 。
這樣,編譯器就無法確定,也就無法編譯了。
--------------------------------------------------------------------------------
如果規定“所有用到的變數要先定義後使用”,上面的程式會怎麼樣呢?
那麼上面這個程式可以正常執行:
1)在輸出語句1的位置為止,只有【作用域 1 】定義了一個 a : int a=1 ,因此輸出 1 。
2)在輸出語句2的位置為止,【作用域 1 】和【作用域 2】分別定義了一個 a :
int a=1 ;
int a=2 ;
根據就近原則,使用最內層作用域的 a ,【作用域 2】裡面的 a ,輸出 2 ;
3)在輸出語句3的位置為止,【作用域 1 】【作用域 2】和【作用域 3】分別定義了一個 a :
int a=1 ;
int a=2 ;
int a=3 ;
根據就近原則,使用最內層作用域的 a ,【作用域 3】裡面的 a ,輸出 3 ;
同理可以分析輸出語句4。
這就是為什麼規定“所有用到的變數要先定義後使用”的原因之一吧。