C語言學習筆記 C常量

2021-09-26 00:22:14 字數 4664 閱讀 9834

常量是固定值,在程式執行期間不會改變。這些固定值,又叫字面量

常量可以是任何的基本資料型別,比如整數常量、浮點常量、字元常量、或字串字面值,也有列舉常量。

常量就像是常規的變數,只不過常量的值在定義後不能進行修改。

整數常量可以是十進位制、八進位制或十六進製制的常量。字首指定基數:0x或0x表示十六進製制,0表示八進位制,不帶字首則預設表示十進位制。

整數常量也可以帶乙個字尾,字尾是u和l的組合,u表示無符號整數,l表示長整數。字尾可以是大寫,也可以是小寫,u和l的順序任意。

下面列舉幾個整數常量的例項:

212		//合法的

215u //合法的

0xfeel //合法的

078 //非法的:8不是八進位制數字

032uu //非法的:不能重複字尾

以下是各種型別的整數常量的例項:

85		//十進位制

0213 //八進位制

0x4b //十六進製制

30 //整數

30u //無符號整數

30l //長整數

30ul //無符號長整數

浮點常量有整數部分、小數點、小數部分和指數部分組成。可以使用小數形式或者指數形式來表示浮點常量。

當使用小數形式表示時,必須包含整數部分、小數部分,或同時包含兩者。當使用指數形式表示時,必須包含小數點、指數,或同時包含兩者。帶符號的指數使用e或e引入的。

下面列舉幾個浮點常量的例項:

3.14159		//合法的

314159e-5l //合法的

510e //非法的:不完整的指數

210f //非法的:沒有小數或指數

.e55 //非法的:缺少整數或分數

字元常量是括在單引號中,例如,『x』可以儲存在char型別的簡單變數中。

字元變數可以是乙個普通的字元(例如『x』)、乙個轉義序列(例如『\t』),或乙個通用的字元(例如『\u02c0』)或製表符(\t)等。下標列出了一些這樣的轉義序列碼:

轉義序列

含義\\

\字元\』

'字元\"

"字元\?

?字元\a

警報鈴聲

\b退格鍵

\f換頁符

\n換行符

\r回車

\t水平製表符

\v垂直製表符

\ooo

一到三位的八進位制數

\xhh…

乙個或多個數字的十六進製制數

下面的例項顯示了一些轉義序列字元:

例項

#includeint main()

當上面的**被編譯和執行時,會產生下列結果:

hello   world
字串字面值或常量是括在雙引號" "中的。乙個字串包含類似於字元常量的字元:普通的字元、轉義序列和通用的字元。

可以使用空格做分隔符,把乙個很長的字串常量進行分行。

下面的例項顯示了一些字串常量。下面這三種形式所顯示的字串是相同的。

"hello,dear"

"hello,\

dear"

"hello," "d" "ear"

在c中,有兩種簡單的定義常量的方式:

使用#define預處理器。

使用const關鍵字。

#define預處理器

下面是使用#define預處理器定義常量的形式:

#define identifier value
具體請看下面的例項:

例項

#include #define length 10   

#define width 5

#define newline '\n'

int main()

上面**被編譯和執行時,他會產生下列結果:

value of area:50
const關鍵字

可以使用const字首宣告制定型別的常量,如下所示:

const type variable=value;
具體請看下面的例項:

例項

#include int main()

當上面的**被編譯和執行時,會產生下列結果:

value of area:50
請注意,把常量定義為大寫字母形式,是乙個很好的程式設計實踐。

注意#define是巨集定義,他不能定義常量,單巨集定義可以實現在字面意義上和其他定義常量相同的功能,本質的區別就在於#define不為巨集名分配記憶體,而const也不為常量分配記憶體,因為const並不是去定義乙個常量,而是去改變乙個變數的儲存類,把該變數所佔的記憶體變為唯讀。

const定義的是變數不是常量,只是這個變數的值不允許改變是常變數!帶有型別。編譯執行的時候起作用存在型別檢查。

define定義的是不帶型別的常數,只進行簡單的字元替換。在預編譯的時候起作用,不存在型別檢查。

1、#define與const兩者的區別

(1)編譯器處理方式不同

#define num 3.14159 //常量巨集

const doulbe num = 3.14159; //此時並未將pi放入rom中 ......

double i = num; //此時為pi分配記憶體,以後不再分配!

double i= num; //編譯期間進行巨集替換,分配記憶體

double j = num; //沒有記憶體分配

double j = num; //再進行巨集替換,又一次分配記憶體!

const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,而不是像#define一樣給出的立即數,所以,const定義的常量在程式執行過程中只有乙份拷貝(因為是全域性的唯讀變數,存在靜態區),而#define定義的常量在記憶體中有若干個拷貝。

(5)提高了效率。編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。

(6)巨集替換只作替換,不做計算,不做表示式求解,巨集預編譯時就替換了,程式執行時,並不分配記憶體。

注意:define有邊緣效應,例:#define n 2+3,n的值是5。

int a=n/2
在編譯是預想a=2.5,實際列印結果是3.5,原因是在預處理階段,編譯器將a=n/2處理成a=2+3/2,這就是define巨集的邊緣效應,所以我們應該寫成#define n(2+3)

#include #define length 10+10

//正確寫法 #define length (10+10)

#define width 5

#define newline '\n'

int main()

以上例項輸出結果:

value of area : 60
所以如果我們需要得到正確結果應該將#define length 10+10修改為#define length (10+10)

單引號與雙引號的區別:

在 c 語言中,單引號與雙引號是有很大區別的。

在 c 語言中沒有專門的字串型別,因此雙引號內的字串會被儲存到乙個陣列中,這個字串代表指向這個陣列起始字元的指標;而單引號中的內容是乙個 char 型別,是乙個字元,這個字元對應的是 ascii 表中的序列值。

四種進製說明:

在二進位制中只有 0、1 兩種情況,你不會看到比 1 大的數字。二進位制是逢 2 就進製,所有數字中沒可能有 2 或大於 2 的數字。

在八進位制中有 0、1、2、3、4、5、6、7這八種情況,你也不會看到比7大的數字。八進位制是逢8就進製,所有數字中沒可能有8或大於8的數字。

在十進位制中有0、1、2、3、4、5、6、7、8、9這十種情況,你更不會看到比9大的數字。十進位制是逢10就進製,所有數字中有0~9都有。

在十六進製制中有 0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f,其中 a 表示 10;b 表示 11;c 表示 12;d 表示 13;e 表示 14;f 表示 15。十六進製制數字中含有 a–f字母,它是 0–9+a–f

C語言學習之常量

1.整型常量 像123這一型別常量如無特別說明都是int型別常量。long型常量要以l或l結尾,比如123456789l。無符號常量要以u或u結尾。整型常量除了用十進位制表示外,還可以用八進位制和十六進製制表示,八進位制前面加0 零 十六進製制前面加0x。2.字元常量 字元常量用 表示,比如 y 本...

C語言學習筆記一(巨集和常量)

1 判斷預處理命令是否被定義 ifdef symbol statements endif舉例 ifndef toupper define toupper endif2 進行if else預處理 ifdef symbol statements else other statements endif舉例...

C語言學習之三 常量

常量的值不允許修改,使用const關鍵字來宣告常量,如下 int const a const int a 以上二個宣告相等,都把a聲時為乙個整數,其值不允許修改。int const pi a 這個宣告表示pi是乙個指向整型的指標,允許修改指標的值,即可以讓指標指向其它位址,但是不可以修改指標所指向的...