區域性變數,全域性變數

2022-08-01 10:03:12 字數 2005 閱讀 9758

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 一般程式把新產生的動態資料存放在堆區,函式內部的自動變數存放在棧區。自動變數一般會隨著函式的退出而釋放空間,靜態資料 即使是函式內部的靜態區域性變數 也存放在全域性資料區。...