if、while中變數的作用域問題
我們知道,函式、類會改變當前變數的作用域。if,while等分支迴圈結構會繼承外部作用域,即外部變數對分支迴圈結構內部可見。
但是c語言不支援if,while等分支迴圈結構內部作用域對外可見,而php則不然。
在php中,if,while等分支迴圈結構中宣告的區域性變數,在分支迴圈結構後面仍然有效。
比如,函式中宣告的變數在函式外面是不可見的
例一:my
<?php
//$globals['he']="hechunhuae";
function test()
test();
echo $he."
";$chun="chunchunchun";
if($chun)else
echo $chun1."
";$hua="hua";
for($n=1;$n<5;$n++)
echo $hua1;
?>
例二:c語言:12
3456
78910
1112
13#include
int foo()
int main()
報錯:scope.c: in function 『main』:
scope.c:11: 錯誤:『bar』 未宣告 (在此函式內第一次使用)
scope.c:11: 錯誤:(即使在乙個函式內多次出現,每個未宣告的識別符號在其
scope.c:11: 錯誤:所在的函式內只報告一次。)
php語言:12
3456
7<?php
function foo()
echo $bar;
報錯:notice: undefined variable: bar in scope.php on line 7
php notice: undefined variable: bar in scope.php on line 7
而if,while等迴圈分支結構會繼承外部作用域,即外部變數對迴圈分支結構內部可見
類似的:
c語言:12
3456
78910
1112
1314
1516
1718
1920
#include
int main()
while(1)
return 0;
}輸出:
php語言:12
3456
78910
1112
1314
<?php
$foo = 1;
if(1)
while(1)
輸出:但是不一樣的地方來了。
c語言:12
3456
78910
1112
1314
1516
1718
1920
2122
2324
#include
int main()
printf("%d\n",bar);
while(1)
printf("%d\n",bar);
return 0;
}報錯:
scope.c: in function 『main』:
scope.c:12: 錯誤:『bar』 未宣告 (在此函式內第一次使用)
scope.c:12: 錯誤:(即使在乙個函式內多次出現,每個未宣告的識別符號在其
scope.c:12: 錯誤:所在的函式內只報告一次。)
php語言12
3456
78910
1112
1314
1516
1718
<?php
$foo = 1;
if(1)
echo $bar,"\n";
while(1)
echo $bar2,"\n";
輸出:這就是需要注意的地方!
全域性變數 靜態全域性變數 靜態區域性變數 區域性變數
全域性和靜態變數都在堆裡。這句話應該錯了,應該是放在常量資料段 全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用...
全域性變數 靜態全域性變數 靜態區域性變數 區域性變數
全域性和靜態變數都在堆裡。全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用在定義它的那個檔案裡,卻不能用在程式中...
全域性變數 靜態全域性變數區域性變數 靜態區域性變數
對於乙個完整的程式,在記憶體中的分布情況如下圖 區 low address 全域性資料區 堆區 棧區 high address 一般程式把新產生的動態資料存放在堆區,函式內部的自動變數存放在棧區。自動變數一般會隨著函式的退出而釋放空間,靜態資料 即使是函式內部的靜態區域性變數 也存放在全域性資料區。...