關於C 中常量的理解

2021-07-04 14:36:57 字數 2902 閱讀 9288

關於c++中常量的理解

一 常量的分類

整型常量(整數)的型別

在上一節中已知道:整型資料可分為int, short int,long int以及unsigned int, unsigned short, unsigned long等類別。整型常量也分為以上類別。為什麼將數值常量區分為不同的類別呢?因為在進行賦值或函式的引數虛實結合時要求資料型別匹配。

浮點數的表示方法

乙個浮點數可以用兩種不同的方式表示:

1) 十進位制小數形式。

如21.456, -7.98等。它一般由整數部分和小數部分組成,可以省略其中之一(如78.或.06, .0),但不能二者皆省略。c++編譯系統把用這種形式表示的浮點數一律按雙精度常量處理,在記憶體中佔8個位元組。如果在實數的數字之後加字母f或f,表示此數為單精度浮點數,如1234f, -43f,佔4個位元組。如果加字母l或l,表示此數為長雙精度數(long double),在gcc中佔12個位元組,在visual c++ 6.0中佔8個位元組。

2) 指數形式(即浮點形式)。

乙個浮點數可以寫成指數形式,如3.14159可以表示為0.314159×101, 3.14159×100, 31.4159×10-1, 314.159×10-2等形式。在程式中應表示為:0.314159e1, 3.14159e0, 31.4159e-1, 314.159e-2,用字母e表示其後的數是以10為底的冪,如e12表示1012。其一般形式為:

數符  數字部分  指數部分

上面各資料中的0.314159, 3.14159, 31.4159, 314.159 等就是其中的數字部分。可以看到:由於指數部分的存在,使得同乙個浮點數可以用不同的指數形式來表示,數字部分中小數點的位置是浮動的。例如:

a=0.314159e1;

a=3.14159e0;

a=31.4159e-1;

a=314.159e-2;

以上4個賦值語句中,用了不同形式的浮點數,但其作用是相同的。

在程式中不論把浮點數寫成小數形式還是指數形式,在記憶體中都是以指數形式(即浮點形式)儲存的。例如不論在程式中寫成314.159或314.159e0, 31.4159e1, 3.14159e2, 0.314159e3等形式,在記憶體中都是以規範化的指數形式存放,如圖2.3所示。

圖 2.3

數字部分必須小於1,同時,小數點後面第乙個數字必須是乙個非0數字,例如不能是0.0314159。因此314.159和314.159e0, 31.4159e1, 3.14159e2, 0.314159e3在記憶體中表示成0.314159×103。儲存單元分為兩部分,一部分用來存放數字部分,一部分用來存放指數部分。為便於理解,在圖2.3中是用十進位制表示的,實際上在儲存單元中是用二進位制數來表示小數部分,用2的冪次來表示指數部分的。

對於以指數形式表示的數值常量,也都作為雙精度常量處理。

1) 普通的字元常量

用單引號括起來的乙個字元就是字元型常量。

如'a', '#', '%', 'd'都是合法的字元常量,在記憶體中佔乙個位元組。注意:

3) 字元資料在記憶體中的儲存形式及其使用方法

將乙個字元常量存放到記憶體單元時,實際上並不是把該字元本身放到記憶體單元中去,而是將該字元相應的ascii**放到儲存單元中。如果字元變數c1的值為'a',c2的值為'b',則在變數中存放的是'a'的ascii碼97,'b' 的ascii碼98,如圖2.4(a)所示,實際上在記憶體中是以二進位制形式存放的,如圖2.4(b)所示。

圖 2.4

既然字元資料是以ascii碼儲存的,它的儲存形式就與整數的儲存形式類似。這樣,在c++中字元型資料和整型資料之間就可以通用。乙個字元資料可以賦給乙個整型變數,反之,乙個整型資料也可以賦給乙個字元變數。也可以對字元資料進行算術運算,此時相當於對它們的ascii碼進行算術運算

用雙撇號括起來的部分就是字串常量,如"abc","hello!","a+b","li ping"都是字串常量。

字串常量"abc"在記憶體中佔4個位元組(而不是3個位元組),見圖2.5。

圖 2.5

編譯系統會在字串最後自動加乙個'\0'作為字串結束標誌。但'\0'並不是字串的一部分,它只作為字串的結束標誌。如

cout<

輸出3個字元abc,而不包括'\0'。

注意: "a"和'a'代表不同的含義,"a"是字串常量,'a' 是字元常量。

前者佔兩個位元組,後者佔1個位元組。請分析下面的程式片段:

char c;  //定義乙個字元變數

c='a';  //正確

c="a";  //錯誤,c只能容納乙個字元

請思考:字串常量"abc\n"包含幾個字元?不是5個而是4個字元,其中"\n"是乙個轉義字元。但它在記憶體中佔5個位元組(包括乙個"\0"字元) 。編譯系統遇到"\"時就會把它認作轉義字元的標誌,把它和其後的字元一起作為乙個轉義字元。

為了程式設計和閱讀的方便,在c++程式設計中,常用乙個符號名代表乙個常量,稱為符號常量,即以識別符號形式出現的常量。

【例2.3】符號常量的使用。

#include

using

namespace std;

#define price 30

//注意這不是語句,末尾不要加分號

intmain()

程式中用預處理命令#define指定price在本程式單位中代表常量30,此後凡在本程式單位中出現的price都代表30,可以和常量一樣進行運算,程式執行結果為

total=300

請注意符號常量雖然有名字,但它不是變數。它的值在其作用域(在本例中為主函式)內是不能改變的,也不能被賦值。如用賦值語句"price=40;"給price賦值是錯誤的。

使用符號常量的好處是:含義清楚,在需要改變乙個常量時能做到"一改全改"。

如:#define price 35

C 類中常量定義

有時我們希望某些常量只在類中有效。由於 define定義的巨集常量是全域性的,不能達到目的,於是想當然地覺得應該用const修飾資料成員來實現。const資料成員的確是存在的,但其含義卻不是我們所期望的。const資料成員只在某個物件生存期內是常量,而對於整個類而言卻是可變的,因為類可以建立多個物件...

c語言中常量區的問題

在群裡有人問了這麼個問題,下面這段程式執行會報錯 int main 看了一眼沒發現問題,自己執行了下,果然報錯,明顯是那種指標型別的錯誤 簡單除錯了下發現問題出在strcat這裡,難道是函式使用不對?確認下沒有問題 群裡有人提示說可能是字元常量的問題,馬上意識到應該就是這問題了,想起曾經琢磨過的記憶...

C 類中 關於常量定義 理解總結

有時我們希望某些常量只在類中有效。由於 define定義的巨集常量是全域性的,不能達到目的,於是想當然地覺得應該用const修飾資料成員來實現。const資料成員的確是存在的,但其含義卻不是我們所期望的。const資料成員只在某個物件生存期內是常量,而對於整個類而言卻是可變的,因為類可以建立多個物件...