引言
深入了解C語言的基本元素、計算機存儲器結構、常量與變量的概念以及數據類型。這些內容是C語言編程的基礎,掌握它們對于編寫高效、可靠的嵌入式程序至關重要。
1.C語言的基本元素
?編程語言的發展離不開自然語言,所以編程語言的語法和詞匯也是由自然語言發展而來,而自然語言的基礎是文字,舉個例子:想要學會漢語,則必須先學會漢字,想要學會英語,則必須先學會單詞,通過下圖可以知道,想要學會C語言,必須先學會關鍵字。
完成一個程序設計的過程就相當于是完成一篇文章的編寫,而一篇文章(程序)是由多個段落(函數)構成的,一個段落(函數)是由多個句子(語句)構成的,一個句子(語句)是由多個短語(表達式)構成的,一個短語(表達式)是由多個單詞(標識符)構成的,一個單詞(標識符)是由多個文字(字符)組成的。
C語言程序由一系列基本元素構成,這些元素包括:
- 字符集:C語言支持的基本字符,包括字母、數字、特殊符號(如?
?+?
?、??-?
?、??*?
?等)。 - 關鍵字:C語言中具有特殊含義的保留字,如?
?int?
?、??return?
?、??if?
?等。 - 標識符:由程序員定義的名稱,用于表示變量、函數、數組等。
- 運算符:用于執行操作的符號,如算術運算符(?
?+?
?、??-?
?)、關系運算符(??>?
?、??<?
?)等。 - 分隔符:用于分隔代碼元素的符號,如分號(?
?;?
?)、逗號(??,?
?)等。
#include <stdio.h>int main() {int a = 10; // int是關鍵字,a是標識符int b = 20;int sum = a + b; // +是運算符printf("Sum: %d\n", sum); // ;是分隔符return 0;
}
可以看到,C語言標準中常用的關鍵字只有32個,并且這些關鍵字都是小寫的,并且都是某些英文單詞的縮寫。 int -- integer? ?char -- character?
2.?計算機存儲器結構
數據概念
數據是計算機處理的基本單位,可以是數字、字符、布爾值等。在C語言中,數據通過變量和常量來表示。人類使用計算機的目的就是為了高效的處理大量數據,但是數據的類型有很多,比如聲音、圖像、文字、數字等,那計算機是如何區分數據的呢? 回答:計算機不用區分,計算機只采用二進制存儲。
內存概念
內存是計算機用于存儲數據和程序的硬件設備。每個內存單元都有一個唯一的地址,程序通過地址訪問內存中的數據。
對于計算機中的存儲器而言,一般分為兩種:RAM(隨機存儲器)和 ROM(只讀存儲器) ?
(1) 只讀存儲器
只讀存儲器的英文全稱是Read Only Memory,簡稱為ROM,屬于非易失性存儲設備,指的是掉電不丟失數據,可以把數據長時間存儲,一般分為很多種,具體的區別可以通過《數電》進行了解,對于計算機的機械硬盤或者固態硬盤而言指的就是ROM。
(2) 隨機存儲器
隨機存儲器的英文全稱是Random Access Memory,簡稱為RAM,屬于易失性存儲設備,指的是掉電會丟失數據,但是讀寫速度很快。所以一般CPU都是直接和RAM打交道。
內存單位
內存中一個MOS管可以存儲一個二進制數0或1,為了方便記憶,標準規定把一個二進制數用bit來進行表示,bit(比特)是binary digit的縮寫,中文翻譯為位。專業術語一般把一個二進制數稱為一位二進制數。所以bit就用來表示計算機數據的最小單位。
注意:計算機處理數據的基本單位是byte,計算機處理數據的最小單位是bit,1byte = 8bit。
內存的單位從小到大依次為:
- 位(Bit):最小的存儲單位,表示一個二進制位(0或1)。
- 字節(Byte):8位組成一個字節,是內存的基本單位。
- 千字節(KB):1024字節。
- 兆字節(MB):1024千字節。
- 吉字節(GB):1024兆字節。
#include <stdio.h>int main() {int a = 10; // 假設int類型占4個字節printf("Size of a: %lu bytes\n", sizeof(a)); // 輸出a占用的內存大小return 0;
}
3.?C語言的常量與變量
C語言采用常量(Constant)和變量(Variable)作為數據存儲的基本單元。從內存管理的角度來看,內存是由連續編址的存儲單元構成的物理空間,每個存儲單元(8位)都具有唯一的地址標識。雖然理論上可以通過直接尋址方式訪問這些存儲單元,但由于效率考量,實踐中通常采用更高級的抽象訪問機制。
根據C語言規范,開發者享有動態內存申請權限。申請過程需遵循以下協議:
- 顯式聲明所需內存空間的大小(以字節為單位)
- 內核負責在物理內存中定位合適的連續空間
- 系統將分配的內存首地址返回給申請者
為提升內存訪問效率,C語言引入了符號化訪問機制:
- 開發者可為分配的內存空間指定標識符
- 系統維護符號名與物理地址的映射關系
- 通過符號名實現間接內存訪問
基于數據可變性特征,C語言將存儲單元劃分為兩種類型:
- 常量(Constant):程序運行期間值不可變
- 變量(Variable):程序運行期間值可變
常量
?常量指的是在程序運行期間值不會發生改變的量,一般使用的數字,比如3.14用來表示圓周率,一般情況下,用戶都是用通過宏定義的方式來實現常量的設計,宏定義其實就是簡單的文本替換,在預處理階段預處理器會把程序中的宏定義進行展開。C語言中規定宏定義使用預處理指令 #define 來進行設計。
常量是程序運行過程中值不會改變的數據。常量可以分為以下幾種:
- 整型常量:如?
?10?
?、??-20?
?。 - 浮點型常量:如?
?3.14?
?、??-0.5?
?。 - 字符常量:如?
?'A'?
?、??'1'?
?。 - 字符串常量:如?
?"Hello, World!"?
?。
變量
變量是程序運行過程中值可以改變的數據。變量指的是在程序運行期間值可能發生變化的量,用戶可以根據實際需要來向kernel申請一塊存儲單元,并對這塊存儲單元進行命名,然后用戶可以隨時修改存儲單元中的數據。申請的存儲單元的大小可以通過C語言中的數據類型進行指定。
?
命名規則
變量和常量的命名需要遵循以下規則:
- 只能包含字母、數字和下劃線(?
?_?
?)。 - 不能以數字開頭。
- 不能使用C語言關鍵字。
- 區分大小寫。
注意:為了防止二義性出現,C語言標準規定不可以把系統保留字,以及程序中已經存在的函數名稱、以及用戶已經定義出來的標識符名稱作為新的標識符名稱(同一個作用域內不能)。 ?
另外:C語言的標識符是區分大小寫,并且作為用戶而言,標識符的命名應該是有意義的
int myVariable; // 合法
int _value; // 合法
int 1value; // 非法,不能以數字開頭
int return; // 非法,return是關鍵字
4.?C語言的數據類型
C語言提供了豐富的數據類型,用于表示不同類型的數據。以下是常見的數據類型:
字符型(??char?
?)
字符型用于存儲單個字符,占用1個字節。C語言標準中提供了一個關鍵字 char ,其實是 character 單詞的縮寫,表示字符的意思,操作系統char類型的數據寬度定義為1字節,用于存儲字符,C語言標準中用單撇號’ ’表示字符。
C語言標準規定:用戶打算存儲字符 ? 數據寬度 ?變量名稱 ; ?舉例: char ?ch ?= ?‘c’ ;
C語言標準中關于字符的種類有兩種:普通字符 and 轉義字符,對于ASCII碼表中轉義字符
注意:ASCII碼中的轉義字符需要使用 ‘\0’ ?‘\r’ ?‘\n’進行表示,代表字符具有特殊的意義分別表示:空格、換行和回車。
#include <stdio.h>int main() {char letter = 'A';printf("%c\n", letter);return 0;
}
輸出:
A
整數型(??int?
?)
C語言標準中使用關鍵字int表示整數,整數型用于存儲整數值,通常占用4個字節,關鍵字 int 的英文單詞是 integer ,對應的中文具有整數的含義,在32系統下關鍵字int的數據寬度是4字節,也就意味著存儲單元所能存儲的整數范圍比較廣泛。
#include <stdio.h>int main() {int number = 100;printf("%d\n", number);return 0;
}
輸出:
100
短整型(??short?
?)
C語言標準中規定使用關鍵字 short 來表示短整型,短整型用于存儲較小的整數值,通常占用2個字節。一般短整型的全稱是 short int ,只不過寫程序的時候可以只寫 short 即可,在32位系統下 short 短整型占2字節。
#include <stdio.h>int main() {short smallNumber = 32767;printf("%d\n", smallNumber);return 0;
}
輸出:
32767
長整型(??long?
?)
C語言標準中規定使用關鍵字 long 來表示長整型,長整型用于存儲較大的整數值,通常占用4個或8個字節。一般長整型的全稱是 long int ,只不過寫程序的時候可以只寫long即可,在32位系統下 long 長整型占4字節,在64位系統占8字節。
#include <stdio.h>int main() {long bigNumber = 2147483647;printf("%ld\n", bigNumber);return 0;
}
輸出:
2147483647
長長整型(??long long?
?)
C語言標準中規定使用關鍵字 long long 來表示長長整型,長長整型用于存儲非常大的整數值。但是長長整型是使用 long long 來表示,在32位和64位系統下長長整型占8字節。
#include <stdio.h>int main() {long long hugeNumber = 9223372036854775807;printf("%lld\n", hugeNumber);return 0;
}
輸出:
9223372036854775807
浮點型(??float?
?和??double?
?)
數據有整數和小數之分,一般情況下處理的數據也是具有小數的,所以C語言標準中規定使用關鍵字 float 來表示單精度浮點數,單精度浮點型占4字節,另外C語言標準中也提供了另一個關鍵字 double 用來表示雙精度浮點數,double 占8字節,其實C語言也提供了一種類型 long double,該類型占16字節。
#include <stdio.h>int main() {float pi = 3.14;double precisePi = 3.1415926535;printf("%f\n", pi);printf("%f\n", precisePi);return 0;
}
輸出:
3.14
3.1415926535
字符串
字符串是表示某種含義的一個字符序列,字符串在內存是需要一塊連續的內存空間進行存儲,C語言中規定字符串使用雙引號””表示,并且規定字符串的結束標志是’\0’,但’\0’不需要用戶手動添加,系統會自動在一個字符串的末尾添加’\0’。
#include <stdio.h>int main() {char name[] = "Alice";printf("%s\n", name);return 0;
}
輸出:
Alice
布爾型(??bool?
?)
用戶有時候需要在程序進行判斷,在C89標準中,用戶如果想要判斷某種條件是否成立,一般是定義一個整型變量,然后利用數字0和數字1來表示條件是否成立,用戶就可以把變量作為一個標志位使用。 ?在C99標準可以使用布爾型來表示真假兩種情況,頭文件 stdbool.h 有相關描述,在頭文件中定義了三個宏,分別是?bool、true?以及?false。
#include <stdio.h>
#include <stdbool.h>int main() {bool isCodingFun = true;printf("%d\n", isCodingFun); // 輸出1表示truereturn 0;
}
輸出:
1
補充:
?C語言標準中提供了兩個關鍵字? &&? unsigned用于修飾整數,unsigned表示無符號,signed表示有符號,C語言中的signed修飾符是隱式聲明,也就是用戶定義整型變量的時候如果沒有特別強調,則整型變量默認是有符號的。用戶如果要存儲無符號的整數,則必須定義變量必須顯式聲明變量是無符號的(unsigned)。