作者在循環(huán)中定義變量并在外部進行調用時,遇到了以下報錯:

代碼(錯誤):
#include <stdio.h>
int main()
{
int n;
scanf_s("%d", &n);
for (int factorial = 1; n >= 1; n--)
{
factorial *= n;
}
return factorial;
}
修改(正確):
#include <stdio.h>
int main()
{
int n;
scanf_s("%d", &n);
int factorial = 1;
for (; n >= 1; n--)
{
factorial *= n;
}
return factorial;
}
原因:
在 if、for、do-while 中是有作用域的,若在這些語句塊中定義變量的話,到了其外部就無法訪問。
作用域:
任何一種編程中,作用域是程序中定義的變量所存在的區(qū)域,超過該區(qū)域變量就不能被訪問。C 語言中有三個地方可以聲明變量:
- 在函數(shù)或塊內部的局部變量
- 在所有函數(shù)外部的全局變量
- 在形式參數(shù)的函數(shù)參數(shù)定義中
讓我們來看看什么是局部變量、全局變量和形式參數(shù)。
局部變量:
在某個函數(shù)或塊的內部聲明的變量稱為局部變量。它們只能被該函數(shù)或該代碼塊內部的語句使用。局部變量在函數(shù)外部是不可知的。
全局變量:
全局變量是定義在函數(shù)外部,通常是在程序的頂部。全局變量在整個程序生命周期內都是有效的,在任意的函數(shù)內部能訪問全局變量。
全局變量可以被任何函數(shù)訪問。也就是說,全局變量在聲明后整個程序中都是可用的。
在程序中,局部變量和全局變量的名稱可以相同,但是在函數(shù)內,如果兩個名字相同,會使用局部變量值,全局變量不會被使用。
形式參數(shù):
函數(shù)的參數(shù),形式參數(shù),被當作該函數(shù)內的局部變量,如果與全局變量同名它們會優(yōu)先使用。
全局變量與局部變量在內存中的區(qū)別:
- 全局變量保存在內存的全局存儲區(qū)中,占用靜態(tài)的存儲單元;
- 局部變量保存在棧中,只有在所在函數(shù)被調用時才動態(tài)地為變量分配存儲單元。
初始化局部變量和全局變量
當局部變量被定義時,系統(tǒng)不會對其初始化,您必須自行對其初始化。定義全局變量時,系統(tǒng)會自動對其初始化,如下所示:
| 數(shù)據(jù)類型 | 初始化默認值 |
|---|---|
| int | 0 |
| char | '\0' |
| float | 0 |
| double | 0 |
| pointer | NULL |
正確地初始化變量是一個良好的編程習慣,否則有時候程序可能會產生意想不到的結果,因為未初始化的變量會導致一些在內存位置中已經可用的垃圾值。