
- C語言程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整型提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策語句
- C語言 - 決策語句
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - 返回語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列的區別
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void 指標
- C語言 - 野指標
- C語言 - 解引用指標
- C語言 - 近指標、遠指標和巨型指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列的區別
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點 (.) 運算子
- C語言 - 列舉 (enum)
- C語言 - 結構體填充和壓縮
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入 & 輸出
- C語言 - 檔案 I/O (檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 編譯預處理指令
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C語言程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言 - 變數
變數只不過是程式可以操作的儲存區域的名稱。C語言中的每個變數都有一個特定的型別,該型別決定變數記憶體的大小和佈局;可以儲存在該記憶體中的值的範圍;以及可以應用於該變數的操作集。
為什麼我們在 C 語言中使用變數?
C語言中的變數是使用者為計算機記憶體中某個特定位置分配的名稱,該位置是大量可隨機訪問的位置的集合,每個位置可以容納單個位。記憶體中的每個位置都由一個唯一的地址標識,該地址以二進位制(或為方便起見使用十六進位制)格式表示。
由於透過引用其二進位制形式的位置來儲存和處理記憶體中的資料非常麻煩,因此像 C 這樣的高階語言允許使用使用者定義的名稱或變數來標識這些位置。
您可以找到合適的助記符識別符號併為其賦值,而不是標識一個空閒記憶體位置併為其賦值。C編譯器將選擇一個合適的位置並將其繫結到您指定的識別符號。
C語言變數的命名約定
變數名必須以字母(大寫或小寫)或下劃線 (_) 開頭。它可以包含字母(大寫或小寫)、數字和下劃線字元。C語言中的變數名不能包含其他字元。
C語言中的變數名區分大小寫。例如,“age”與“AGE”不同。
ANSI 標準認可變數名長度為 31 個字元。儘管您可以選擇具有更多字元的名稱,但只識別前 31 個字元。使用描述性變數名來反映其意圖儲存的值被認為是一種良好的實踐。避免使用可能導致混淆的非常短的變數名。
C 是一種靜態型別語言。因此,必須在變數名稱之前宣告變數的資料型別。變數可以在函式內(區域性變數)或全域性宣告。可以在單個語句中宣告多個相同型別的變數。
示例
根據上述規則和約定,以下是一些有效和無效的變數名
int _num = 5; // valid integer variable float marks = 55.50; // valid float variable char choice = '0'; // valid char variable // invalid variable name // cannot use "-" int sub-1 = 35; //invalid; must have data type avg = 50; // invalid; name can be used for // declaration only once in a function int choice = 0; // Valid integer name int sal_of_employee = 20000; // Valid because all are of same type int phy, che, maths; // error because variables of // different types in same statement int sal, float tax;
在 C 語言中,變數可以儲存屬於其識別的任何型別的資料。因此,變數的型別數量與C語言中的資料型別數量一樣多。
序號 | 型別和描述 |
---|---|
1 | char 通常是一個八位位元組(一個位元組)。它是一種整數型別。 |
2 | int 機器最自然的整數大小。 |
3 | float 單精度浮點值。 |
4 | double 雙精度浮點值。 |
5 | void 表示型別缺失。 |
C程式語言還允許定義各種其他型別的變數,例如列舉型別、指標型別、陣列型別、結構體型別、聯合體型別等。在本節中,我們只學習基本變數型別。
C語言中的變數定義
變數定義告訴編譯器在哪裡以及為變數建立多少儲存空間。變數定義指定資料型別,幷包含一個或多個該型別變數的列表,如下所示:
type variable_list;
這裡,type必須是有效的 C 資料型別,包括 char、w_char、int、float、double、bool 或任何使用者定義的物件;variable_list可以包含一個或多個用逗號分隔的識別符號名稱。
這裡顯示了一些有效的變數宣告:
int i, j, k; char c, ch; float f, salary; double d;
語句int i, j, k;宣告並定義變數 i、j 和 k;這指示編譯器建立名為 i、j 和 k 的型別為int的變數。
可以在變數宣告中初始化(分配初始值)變數。初始化器由等號後跟一個常量表達式組成,如下所示:
type variable_name = value;
示例:變數定義和初始化
請看以下示例
// declaration of d and f extern int d = 3, f = 5; // definition and initializing d and f int d = 3, f = 5; // definition and initializes z byte z = 22; // the variable x has the value 'x' char x = 'x';
對於沒有初始化器的定義:具有靜態儲存期的變數隱式初始化為 NULL(所有位元組的值均為 0);所有其他變數的初始值未定義。
C語言中的變數宣告
根據 ANSI C 標準,所有變數都必須在開頭宣告。不允許在第一個處理語句之後宣告變數。儘管 C99 和 C11 標準修訂已刪除此規定,但它仍然被認為是一種良好的程式設計習慣。您可以宣告一個變數以便稍後在程式碼中為其賦值,或者您可以在宣告時初始化它。
示例:變數宣告
// declaration with initialization int x = 10; // declare first and assign later int y; y = 20; // define and initialize two variables int d = 3, f = 5; // the variable x has the value 'x' char x = 'x';
一旦聲明瞭某種型別的變數,就不能為其分配任何其他型別的變數值。在這種情況下,C編譯器將報告型別不匹配錯誤。
變數宣告向編譯器保證存在具有給定型別和名稱的變數,以便編譯器可以在無需有關變數的完整詳細資訊的情況下繼續進行進一步的編譯。變數定義僅在編譯時具有其含義,編譯器在連結程式時需要實際的變數定義。
當您使用多個檔案並在其中一個檔案中定義變數時,變數宣告很有用,這些變數在連結程式時可用。您將使用關鍵字“extern”在任何地方宣告變數。儘管您可以在 C 程式中多次宣告變數,但它只能在一個檔案中、一個函式中或一段程式碼中定義一次。
示例
嘗試以下示例,其中變數已在頂部宣告,但已在 main 函式內定義和初始化:
#include <stdio.h> // Variable declaration: extern int a, b; extern int c; extern float f; int main () { /* variable definition: */ int a, b; int c; float f; /* actual initialization */ a = 10; b = 20; c = a + b; printf("value of c : %d \n", c); f = 70.0/3.0; printf("value of f : %f \n", f); return 0; }
輸出
編譯並執行上述程式碼後,會產生以下結果
value of c : 30 value of f : 23.333334
同樣的概念也適用於函式宣告,在宣告函式時提供函式名,其實際定義可以在其他任何地方給出。例如:
// function declaration int func(); int main() { // function call int i = func(); } // function definition int func() { return 0; }
C語言中的左值和右值
C語言中有兩種表示式
- 左值表示式
- 右值表示式
C語言中的左值表示式
引用記憶體位置的表示式稱為“左值”表示式。左值可以出現在賦值運算子的左側或右側。
C語言中的變數是左值,因此它們可以出現在賦值運算子的左側。
C語言中的右值表示式
術語“右值”指的是儲存在記憶體某個地址處的資料值。“右值”是一個不能為其賦值的表示式,這意味著右值可以出現在賦值運算子的右側,但不能出現在左側。
數字字面量是右值,因此它們不能被賦值,也不能出現在左側。
讓我們看一下以下有效和無效的語句
// valid statement int g = 20; // invalid statement // it would generate compile-time error 10 = 20;
C語言中的變數可以根據以下引數進行分類
資料型別 - int、float、char 或 struct 型別。
作用域 - 全域性變數或區域性變數。
儲存型別 - 自動、靜態、暫存器或外部。
我們將在本教程的後面學習區域性和全域性型別以及儲存型別。