1. c語言的變數定義
淺談C語言變數
王佰營 徐麗紅
任何一種編程語言都離不開變數,特別是數據處理型程序,變數的使用非常頻繁,沒有變數參與程序甚至無法編制,即使編制運行後的意義也不大。變數之所以重要,是因為變數是編程語言中數據的符號標識和載體。
C語言是一種應用廣泛的善於實現控制的語言,變數在C語言中的應用更是靈活多變。那麼變數究竟是什麼呢?變數是內存或寄存器中用一個標識符命名的存儲單元,可以用來存儲一個特定類型的數據,並且數據的值在程序運行過程中可以進行修改。可見,變數首先是一個標識符或者名稱,就像一個客房的編號一樣,有了這個編號我們在交流中就可方便言表,否則,我們只可意會,那多不方便。為了方便,我們在給變數命名時,最好能符合大多數人的習慣,基本可以望名知義,便於交流和維護;其次,變數是唯一確定的對應內存若干存儲單元或者某個寄存器。這些是編譯器來保證的,用戶一般不用費心。
程序員一旦定義了變數,那麼,變數就至少可為我們提供兩個信息:一是變數的地址,即就是,操作系統為變數在內存中分配的若干內存的首地址;二是變數的值,也就是,變數在內存中所分配的那些內存單元中所存放的數據。
由於程序的多樣需要,我們對變數也有各種各樣的要求,比如:變數的生命期,變數的初始狀態,變數的有效區域,變數的開闢地和變數的開辟區域的大小等等;為了滿足這些要求,C語言的發明者就設置了以下變數:
1、 不同數據類型的變數;如:char cHar, int iTimes, flaot faverage;
2、 全局變數或者叫全程變數;
3、 局部變數;
4、 靜態變數: 靜態全局變數和靜態局部變數;關鍵詞:static
5、 寄存器變數;關鍵詞:register;
6、 外部變數: 關鍵詞:extern;
C語言中,變數在內存中開闢地的大小由數據類型決定的,由於PC機中規定一個地址單元存一個位元組,不同的數據類型的變數,為其分配的地址單元數是不一樣的。C語言中除幾種基本的數據類型外用戶還可以自己定義所需要的數據類型:
1、 bool型 sizeof(bool): 1
2、 char型: sizeof(char): 1
3、 short型: sizeof(short): 2
4、 int型: sizeof(int): 4
5、 long型: sizeof(long): 4
6、 float型: sizeof(float): 4
7、 double型: sizeof(double): 8
8、 自定義型:如:
typedef struct tagMyData
{
char cHar;
int iTimes;
float faverage;
}MyDatap;
sizeof(MyDatap): 12
char szBuf[]="HELLO C&C++!";
sizeof(szBuf): 13
局部變數和全局變數是相對而言的;如下:局部變數 int itmp;
int Get_Max( const int& x, const int& y, const int& z )
{
int itmp;
if(x > y) itmp = x;
else itmp = y;
if( itmp > z ) return itmp;
else return z;
}
在函數內部說明的變數為局部變數,只有在函數執行時,局部變數才存在,當函數執行完退出後,局部變數隨之消失。也就是,當函數執行完退出後,原先在函數內定義的變數現在不能用,這通常由編譯器保證,它會阻止編譯通過。也就是說,原來為那個局部變數分配的內存,現在已經不屬於它,它再無權訪問了。如要再使用這些內存單元就必須從新定義變數來申請,只有分配給的變數才可訪問它。否則,就會出錯,如數組越界訪問。
與局部變數不同,全局變數在整個程序都是可見的,可在整個程序運行過程中,對於任何一個程序都是可用的。全局變數的說明的位置在所有函數之外,但可被任何一個函數使用,讀取或者寫入。如下:全局變數 int iCount, bool bForward;
int iCount; //全局變數;
bool bForward; //全局變數;
void add( void );
void dec( void );
void man(void )
{
while( iCount < 1000 && iCount > -1000)
{
add( );
dec( );
printf("COUNT:%d;\n", iCount)
}
}
void add( void )
{
if( bForward ) iCount++;
}
void dec( void )
{
if(!bForward ) iCount--;
}
可見,全局變數非常方便不同函數間數據共享,同樣,任何函數在在使用數據時,都不敢保證數據是否已被修改。如果程序員無法保證這個,就盡量避免使用全局變數。
靜態變數是分配在存儲器中C程序所佔據的數據段內, C程序運行的整個過程中一直保留,不會被別的變數佔用。靜態變數可以定義成全局變數或局部變數,當定義為全局變數時,在它定義的程序的整個運行期間均存在並且保持原來的存儲單元位置不會改變。那麼既然有了全局變數為什麼還要定義全局靜態變數呢?看下邊的示例:
模塊1:
int a;
static int b;
void fun1( void )
{
……
fun2( );
……
}
模塊2:
extern int a;
satic int b;
void fun2( void )
{
……
fun1( );
……
}
分別編譯,然後鏈接兩個模塊。。。。。。
模塊1和模塊2中,變數a為同一個變數;而變數b就不是同一個變數!雖然它們的的數據類型和名稱均相同;就是因為有static;原因是,如果在全局變數說明前加上靜態變數說明符static,它就會通知編譯器該全局變數只在被定義的這個文件或模塊中可見的。就是說,該靜態全局變數在其他文件中是不可見的,在其他文件中的程序是不允許訪問的。這在一定程度上減少了全局變數的副作用的影響。
同靜態全局變數定義一樣,當在局部變數名前加靜態變數說明符static,該變數就定義為靜態局部變數。編譯器為該變數建立永久存儲單元。永久是指C程序運行的整個過程中一直保留,不會被別的變數佔用。靜態局部變數和靜態全局變數的根本區別在作用區域上,靜態局部變數只在它被說明的函數或復合語句中有效,並且在兩次函數調用期間仍然保存其值不變,即就是有記憶功能;它們的生命期是相同的,和C程序整個運行期同在。如下例:
#include "stdafx.h"
void counts(void);
void countd(void);
int main(int argc, char* argv[])
{
int i = 0;
while( i++<10)
{
counts( ); //使用靜態局部變數
}
i = 0;
while( i++<10)
{
countd( ); //使用局部變數
}
return 0;
}
void counts(void) //使用靜態局部變數
{
static int isc ; //未賦初值;
isc++;
printf("dsc = %d;\n", dsc);
}
void countd(void) //使用局部變數
{
int idc = 0;
idd++;
printf("idc=%d;\n",idc);
}
執行結果為:
isc = 1; //使用靜態局部變數
isc = 2;
isc = 3;
isc = 4;
isc = 5;
isc = 6;
isc = 7;
isc = 8;
isc = 9;
isc = 10;
idc = 1; //使用局部變數
idc = 1;
idc = 1;
idc = 1;
idc = 1;
idc = 1;
idc = 1;
idc = 1;
idc = 1;
idc = 1;
通過以上程序你也看得出:
1、 局部變數和靜態局部變數的區別:記憶功能;
2、 靜態局部變數只初始化一次,並且默認初始化為0;
靜態變數在定義時若未被賦值,則編譯程序將其初始化為0;
寄存器變數不像其他變數那樣在內存中存放數據,而是在CPU的寄存器中暫存數據,使用寄存器變數比使用內存變數的操作速度快得多。只有整型和字元型變數可定義為寄存器變數。定義方式如下:
register int iTemp;
由於CPU中寄存器有限,盡量減少使用數量和和佔用時間,用完馬上釋放;不能定義為全局變數,也不能定義在結構或者類中。
為了大型程序的管理,將一個大型的程序分成若干個獨立的模塊和文件分別編譯,然後統一鏈接在一起。為了解決全局變數和函數的共用問題,就引入了extern關鍵字。這樣只需在一個文件中定義全局變數和函數,在另一個文件中要用到這些變數和函數時,只需將那個文件中的變數和函數說明表復制過來,在前面加上extern,告訴編譯器,這些變數和函數已經在別的文件中定義說明,在此不必再定義說明了。
2. JAVA語言中,什麼是變數,如何定義一個變數什麼是常量
變數:
變數是程序運行過程中它的值是允許改變的量。
變數定義:定義必須嚴格按照標識符的命名規則,即0~9數字、字母、下滑線、$等組成,且首字母不能是數字、不能是java關鍵字。
變數格式為[訪問修飾符][修飾符]數據類型 變數名[=初始值]。
eg:public static int a=0;
byte b=2;
常量:
常量是不可改變的量,一次賦值,永不改變。
常量定義:常量需要有final修飾符修飾。常量聲明時必須初始化。常量標識符必須大寫,且多個單詞時用下滑線連接。
注意:有時候常量也可以不用在聲明時就初始化。
eg:做局部變數
public class Test {
public static void main(String[] args)
{
final int Y;
Y=9;
}
}
做靜態全局變數時,若聲明時不服初值,必須在靜態代碼塊中賦初值。
static final int Y;
static{
Y=9;
}
做非靜態全局變數時,若聲明時不服初值,則必須在非靜態代碼塊中賦值。
(2)如何用程序定義變數擴展閱讀:
使用變數時注意事項:
作用域:變數定義在那個大括弧內,它就在這個大括弧內有效。並且,在同一個大括弧內不能同時定義同名的變數。
初始化值:沒有初始化值得變數不能直接使用。 只要在使用前給值就行,不一定要在定義是給值。
定義變數的格式: a:數據類型 變數名 = 初始化值; b:數據類型 變數名;變數名 = 初始化值;c:在一行上建議只定義一個變數可以定義多個。
參考資料來源:網路-Java