【C++學習計劃】一文玩轉變量作用域(Day3)


上一篇:【C++養成計劃】基本語法(Day2)
昨天我瞭解了C++的基本語法,今天我們來學習下變量作用域。在玩轉變量作用域之前呢,我們得先來看下什麼是變量

一、變量

  • 什麼是變量? 變量名其實是程序可操作的內存的名稱,變量值是內存裏存儲的數據。變量名由我們定義,它替代了變量值在內存中的存儲地址,這樣使得代碼更友好。
  • 變量的命名規則。變量名也是一種標識符,是由字母、數字和下劃線字符組成。具體規則同C++標識符。詳見:【C++養成計劃】基本語法(Day2)
  • 變量類型。每個變量都有指定的類型,類型決定了變量存儲空間的大小和結構,該範圍內的值都可以存儲在內存中。
  • 變量定義、聲明與初始化。變量在使用之前,需要首先聲明(定義)其類型和名稱。在聲明(定義)一個變量的同時,也可以給它賦予初值。在C++程序中,大多數情況下變量聲明等同於變量定義。
#include<iostream>
using namespace std;
int main()
{
	//1.聲明(定義)變量
	int a;
	int b, c;
	//2.初始化
	a = 0;
	b=1, c=2;
	//3.邊聲明邊初始化
	int a=0;
	int b=0, c=0;
	return 0;
}

二、變量類型

在進行編程時,需要用到各種變量來存儲各種信息。變量在使用之前,需要首先聲明其數據類型,操作系統會根據變量的數據類型,來分配內存和決定在保留內存中存儲什麼。
基本的數據類型有:字符型、寬字符型、整型、浮點型、雙浮點型、布爾型、無類型等。
在這裏插入圖片描述
其中寬字符型比較特殊,其實是使用關鍵字typedef,由 short int 替換而來的數據類型。初學者可以先不掌握。

//關鍵字typedef將變量類型 short int 替換成了 wchar_t
typedef short int wchar_t;

一些基本的數據類型還可以使用一個或多個類型修飾符進行修飾:

  • signed :有符號
  • unsigned:無符號
  • short:短
  • long:長

下表顯示了各種變量類型在內存中存儲值時佔用的內存大小,以及該類型的變量所能存儲的最大值和最小值。不同系統會有所差異。
在這裏插入圖片描述
對於未知數據類型的變量,想到知道它在內存中存儲值時佔用的內存大小,可以使用sizeof來確定該變量的字節長度。

cout<<"數據類型int佔用內存的字節長度:"<<sizeof(int);

C++ 也允許定義各種其他類型的變量,比如枚舉、指針、數組、引用、數據結構、類等等,這將會在後續的章節中進行講解。

三、常量

  1. 字面常量。字面常量可以是任何類型,比如布爾型:true、false;整型:1、2、100;字符串:“Hello C++”,"I love you"等等。
  2. 使用const將變量聲明爲常量。從實用和編程的角度來看,這是最重要的C++常量聲明方式。聲明方式如下:
將圓周率Pi聲明爲一個常量
const double Pi = 3.14;
注:Pi是一個類型爲double的常量。因此後面再不能對Pi重新賦值,否則將出現編譯錯誤。
  1. 枚舉常量。在某些情況下,變量只能有一些特定的取值。例如,彩虹只有七種顏色,指南針的方位不能爲“左”。在這些情況下,變量的取值範圍由自己確定,可使用關鍵字enum來聲明枚舉常量。
enum RainbowColors
{
	Vilet = 0;
	Indigo,
	Blue,
	Green,
	Yellow,
	Orange,
	Red
};
用枚舉常量來指定變量的類型,這樣聲明的變量只能取指定的值。因此,如果要聲明一個變量來存儲彩虹的顏色,做法如下:
RainbowColors MyColor = Blue;
聲明枚舉常量時,編譯器將枚舉值(Vilet等)轉換爲整數,每個枚舉值都比前一個大1。
你可以指定起始值,如果沒有指定,編譯器默認起始值爲0。
因此,可知MyColor存儲的藍色Blue對應的數值是:2
  1. 使用#define定義常量。這種做法已經被摒棄,因此不建議使用這種方法。這裏介紹只是爲了幫助你理解一些舊程序。
這裏同樣將圓周率Pi聲明爲一個常量,做法如下:
#define Pi 3.14
這是一個預處理器宏,讓預處理器將隨後出現的所有Pi都轉換爲3.14。這是一種文本替換,而不是智能替換。編譯器既不瞭解也不關心常量的類型。

四、變量作用域

4.1 局部變量

在函數或一個代碼塊內部聲明的變量,稱爲局部變量。它們只能被函數內部或者代碼塊內部的語句使用。

#include <iostream>
using namespace std;
void Mul()
{
	int a=0,b=0; //局部變量
	cout<<"輸入第一個數:";
	cin>>a;
	cout<<"輸入第二個數:";
	cin>>b;
	int MulResult = a*b;
	cout<<a<<"*"<<b<<"="<<MulResult<<endl;
}
int main() 
{
	Mul();
	//cout<<a<<"*"<<b<<"="<<MulResult<<endl;
	return 0;
}

這是一個簡單的計算乘法的程序,運行結果如下:
在這裏插入圖片描述
分析:程序中的a、b是局部變量,作用域在函數Mul()內。如果在主函數main()中添加註釋了的那一行,程序會報錯。因爲不能在函數Mul()使用局部變量a、b。

4.2 全局變量

在所有函數外部定義的變量(通常是在程序的頭部),稱爲全局變量。全局變量可以被任何函數訪問。全局變量一旦聲明,在整個程序中都是可用的。

#include <iostream>
using namespace std;
//聲明全局變量
int a=0, b=0, MulResult=0;
void Mul()
{
	cout<<"輸入第一個數:";
	cin>>a;
	cout<<"輸入第二個數:";
	cin>>b;
	MulResult = a*b;
	cout<<a<<"*"<<b<<"="<<MulResult<<endl;
}
int main() 
{
	Mul();
	cout<<a<<"*"<<b<<"="<<MulResult<<endl;
	return 0;
}

運行結果如下:
在這裏插入圖片描述
分析:這次把a、b聲明爲全局變量,可見a、b不僅在Mul()函數中有效,在主函數main()中也有效。

4.3 局部變量覆蓋全局變量

在程序中,局部變量和全局變量的名稱可以相同,但是在函數內,局部變量的值會覆蓋全局變量的值。下面是一個實例:

#include <iostream>
using namespace std;

int MulResult=10; //全局變量 
int main() 
{
	int MulResult=5; //局部變量 
	cout<<"MulResult="<<MulResult<<endl; 
	return 0;
}

當上面的代碼被編譯和執行時,它會產生下列結果:
在這裏插入圖片描述

4.4 初始化局部變量和全局變量

當局部變量被定義時,系統不會對其初始化,您必須自行對其初始化。定義全局變量時,系統會自動初始化爲下列值:
在這裏插入圖片描述
正確地初始化變量是一個良好的編程習慣,否則有時候程序可能會產生意想不到的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章