大家好 歡迎回到C++程序設計 那麼今天我們要講的內容是常量和變量 那麼我們在程序中經常要用到常量和變量 那麼現在我們就來學習一下如何在程序中描述常量 如何在程序中來描述變量 首先我們先來看一下常量的定義 什麼是常量呢 我們說常量是指程序中其值不能被修改的數據就是常量了 就常量的最大特點就是它的值是不能夠改變的 那麼我們把常量分為字面常量和符號常量 首先我們先來看字面常量 什麼叫字面常量呢 字面常量指的就是 我們從字面上就可以判斷出它的類型的這類常量 就叫做字面常量了 比如說我們這號的64 它一看就是一個整形數據 那麼比如3.1415926 它一看就是一個十形的一個常量 而大寫字母A一看就是一個字符形的常量 那麼每個字面常量都具有數據類型 由它的數學形式和值來決定的 那麼首先我們先來研究一下整形常量 那麼整形數據我們在程序中常用的幾種進制 就是十進制 八進制和十六進制 那麼十進制的整數它的表示 就按我們平時的這種表示形式就可以了 比如說13576或者-680等等 那麼如果你想表示的是一個八進制的一個整數 那麼就需要在這個數的前面加上一個0 表示它是一個八進制 比如說012它表示的不是十進制的12 而是八進制的12 那麼0177它也表示的是一個八進制的177 那麼如果是十六進制的整數 那麼前面就要加上一個0x 這個x可以大寫 也可以小寫 比如說0x1234它就是一個十六進制的1234 0xab或者0xcf等等 那我們可以看到在十六進制的描述中 這個字母的表示也可以是小寫 也可以是大寫 下來我們來看一下伏典型的常量的表述形式 那麼伏典型常量有兩種描述形式 一種就是小數形式 就是我們常用的這種形式 比如說3.14 0.25這樣的一些形式 那麼小數形式的描寫有兩個要求 一個就是小數點是不能省略的 就是說你如果把小數點省略了 就看不出它是一個實行的一個常量了 其次就是小數點前後可以省略其中之一 就是說我們可以把小數點前的這個數省略了 或者把小數點後面這個省略了 但是不能都省略 那我們看例子 比如說.123 它其實描述的就是0.123 把小數點前面那個0省略了 那麼123.2描述的就是123.0 把小數點後面的這個數省略了 那麼前面和後面只能省略其中之一 再比如說0.0也是正確的描述形式 那麼實行數據還可以以指數的形式來進行描述 那麼指數就是我們說的科學技術法 那麼在這種描述方式裡面 我們用e來表示這個底數10 這個e可以是大寫 也可以是小寫 那麼e的後面描述的就是10的某個次幂 這個n表示的就是次幂 前面就是這個數據本身了 好 那我們看例子 比如說0.31415926e=10 相當於就是0.31415926×10^1 那麼在這種指數形式裡面 我們也有書寫上的一個要求 第一個要求就是e的前面和後面都必須有數字 就是它不能省略前面或者後面的數字 其次就是e後面的這個數字必須是一個整數 因為它表示的是10的某個次幂 所以它就必須是一個整數了 那麼這還我們也說了 我們也說了這個數字的後面 它是一個整數的後面 那麼這還我們也說了 伏點型常量默認為double類型的 就是你比如說寫個3.14 那麼默認它的類型就是一個double型的一個式型常量 那麼如果在數字後面加上一個f 那麼它就會變成flat類型了 就是3.14f表示的就是一個單精度類型的式型常量了 好 那麼下來我們來看一下字符型的常量 怎麼來描述一個字符呢 它的方法就是用一對單引號括起來的一個字符 注意我們這強調了一下一個的概念 就是單引號裡面只能有一個字符 不能出現多個字符 比如說單引號裡面放一個大寫字母A 表示的就是A 那麼單引號裡面放的0 表示的就是0這個字符 單引號裡面放的這個符號 那麼我們看下面這個形式 單引號裡面放了兩個字符AB 那麼這種形式肯定是錯誤的 沒有任何一種常量會寫成這樣的一個形式 那麼字符常量表示的是一個字符 那麼存儲的是該字符的阿斯科馬值 例如大寫字母A表示的是英文字符A 那麼它的數據值是65 那麼特別要區分的就是 加上單引號的數字和不加單引號的數字 兩個含義上的區別 我們說加上單引號了 那麼它表示的就是字符2 那麼它有它自己的阿斯科馬值 那麼如果不加單引號的話 那麼它就是2本身了 那麼它倆如果參與算術運算的話 那麼它們表示的值是不一樣的 那麼下來我們來看一下 用轉譯字符來表示字符常量 就用單引號引起一個字符 這是我們用的比較多的 但是我們也可以用轉譯字符來表示字符常量 什麼叫轉譯字符呢 就是以反斜槓開頭 後面跟一個或幾個字符序列 表示的字符稱為轉譯字符 那麼例如反斜槓N 這就是一個轉譯字符 它是用反斜槓和N組合成的一個字符 那麼這個反斜槓N表示的就是一個換行符 那麼轉譯字符為什麼叫轉譯字符呢 就是它把這個字符本身的含義轉變了 比如說反斜槓N 其實它表示的是一個換行符 而不是N本身這個字符了 所以就叫做轉譯字符 那麼轉譯字符有什麼用呢 我們說採用轉譯字符可以表示ASK字符集中 不可打印或不方便輸入的控制字符 和其他特定功能的字符 就舉個例子 比如說鍵盤上有一些字符並沒有這個按鍵 它不像我們的ABCD1234有按鍵 我們可以通過按鍵輸入進去 那麼當沒有這個按鍵的時候怎麼辦呢 那麼這時候我們就可以用轉譯字符來描述這個符號了 那麼下來我們看常用的轉譯字符 那麼轉譯字符分成這麼三大類 一類就是控制符 就是它已經不是字符本身了 而變成一個控制的一個符號了 比如說反斜槓A表示的是一個響鈴符 反斜槓B是一個退格符 就是讓光標往前退上一格 反斜槓F是一個靜止符 反斜槓N是一個換行符 反斜槓R是一個回車符 就是它的作用就是 如果你的光標是在後面的話 那麼執行了反斜槓R 就使得這個光標跳到本行的第一列這個位置了 那麼反斜槓T是一個水平制表符 就是說我們計算機屏幕被分成制表區 那麼每八列為一個制表區 那麼就是前八列是制表區 然後從第九列開始是第二個制表區 那麼以此類推 那麼反斜槓V表示的是垂直的這樣一個制表符 那麼這些都是控制符 都是控制的轉譯字符 那麼還有一類轉譯字符 表示的就是這個符號本身 比如說反斜槓加上個單一號 那麼表示的就是單一號 反斜槓加上一個雙引號 表示的就是雙引號 那麼如果想表示反斜槓這個字符怎麼辦呢 兩個反斜槓就可以了 第一個反斜槓是轉譯字符的開始標誌 第二個反斜槓才是我這個字符本身 那麼再比如說反斜槓問號 那麼表示的就是問號本身了 那麼如果是反斜槓0 它表示的就是空字符 就是阿斯科馬維林的那個空字符了 那麼還有一種轉譯字符的表示形式 就是用三位的八進制數 來表示一個字符的阿斯科馬值 那麼這三個O表示的是三位的八進制數 或者用反斜槓X加上兩位的16進制數 來表示一個字符 那麼這個三位的八進制和兩位的16進制 它表示的肯定都是字符的阿斯科馬 好 那麼接著我們來看 這兩種表示形式稱為通用轉譯字符 為什麼叫通用的呢 因為任何字符是不是都可以用這種形式來表示 那麼因為每一個字符肯定都有它的阿斯科馬值 那麼既然有阿斯科馬值 我就可以把這個阿斯科馬 寫成三位的八進制數或者兩位的16進制數 因此它倆就稱為通用的轉譯字符了 好 那麼下來我們看例子了 比如說這樣的一個字符串 我們說雙引號引起的一個字符序列 就是一個字符串了 那麼這樣的一個字符串裡面包含了幾個字符呢 我們分析一下 首先一個反斜槓說明我要開始一個轉譯字符了 然後後面跟著一個1 那麼由於它前面沒有x 所以這個1肯定是八進制的一個1 對吧 然後跟著一個2 跟著一個3 它最多跟三位八進制數 所以反斜槓123組成了一個字符 而4是單另一個字符 所以這個字符串裡面就有兩個字符 那麼再看反斜槓128 那麼首先反斜槓是轉譯字符開始的標誌 然後1是一個 2是一個 8是一個 我們看八進制裡面有沒有8呀 八進制的這個符號是不是就是從0到7呀 所以是沒有8這個符號的 因此這個8和反斜槓12不是同一個字符 因此它裡面也有兩個字符 一個是反斜槓12 一個是8 好 那麼反斜槓19也是同樣的道理 它會被分解成反斜槓1和9 那麼反斜槓9這種寫法是不是錯誤的 因為你反斜槓後面不能是空的 必須要有東西呀 那你這個9又不構成八進制數 所以它就是一個錯誤的 或者反斜槓0xfe也是錯誤的 它錯在哪呢 就是你表示轉譯字符的時候 你後面跟的是反斜槓x 而不是0x 所以這號寫錯了 這種形式也是錯誤的了 好 那麼由於字符型數據在內存中只佔一個字節 那麼即使按無符號處理 其最大取值也僅是255 就是一個字節能表示的最大的一個數就是255了 不可能超過255 所以三位的八進制數 它的取值範圍為0~377 這個377是八進制的一個數 也就是說我們在表示這個三位八進制數的方法 表示轉譯字符的時候 它是有一個取值的 取值就是0~377 如果超過這個取值肯定是有問題的 那麼同理 兩位16進制數的取值範圍是0~ff 那麼有了這個取值範圍 我們一眼就可以判斷出這個轉譯字符是否是合法的了 下面我們看一個轉譯字符的一個應用舉例 那麼在這個例子裡面 我們有兩條輸出語句 那麼兩條輸出語句都是輸出一個字符串 各輸出一個字符串 那麼這個字符串裡面包含著大量的轉譯字符 那麼下來我們就看看它的輸出效果是什麼樣子的 我們首先先看第四行的第一條輸出語句 我先輸出一個a b 然後空格c 都原樣輸出 然後接著是一個反斜槓t 反斜槓t就是跳到下一個制表位置 那麼當輸出完c以後 這個光標是在第五列的 那麼它是位於第一個制表位置的 一個制表位置就是八列 那麼跳到下一個制表位置 於是光標是不是就跳到第九列去了 所以執行了這個符號以後 光標就跳到第九列去了 然後在第九列輸出一個空格 輸出一個d 輸出一個e 好 輸出完了以後 我們看反斜槓r 反斜槓r的意思就是讓光標回到本行的開頭的位置 所以這時候光標是不是又回到了 我們的這個第一行的第一列這個位置了 所以光標比如說輸出結果在這 光標跑到第一行第一列這個位置了 好 那麼接著輸出一個f 所以我們看f就輸出在這個位置了 把剛才的a是不是就給替換掉了 然後接著再輸出一個反斜槓t 那麼我們的光標是不是又跳到第九列去了 但是它跳的時候 它是一位一位跳的 也就是剛才的這個什麼b 空格 c de 是不是都被它 b 空格 c 是不是都被它抹殺掉了 就它一個一個跳過去以後 它凡經過的地方都會變成空格 所以這幾個字符就沒有了 那麼跳到第九列就是跳到123456789 就是跳到這個位置 g這個位置了 好 跳到這個位置以後 它輸出一個g 所以這個位置就是一個g了 好 那麼字符串輸出完了以後是一個換行符 於是光標又跑到第二行的第一列這個位置去了 好 我們再看下一行是怎麼輸出的 第二個輸出語句 先輸出一個h 所以這個地方是一個h 那麼又是一個反斜槓t 是不是又跑到第九列去了 所以光標又跑到這兒去了 好 然後在這個位置它輸出了一個i 所以在這個位置就輸出了一個i 然後輸出i完以後 光標是不是就跑到i的後面去了 就是這個光標它是自動向後跳的 你輸出完一個數據以後 它的光標就跑到下一個位置去了 所以i輸出完以後 光標應該是在k的這個位置 然後接著執行一個反斜槓b 那麼反斜槓b就是回退一格 那麼光標是不是又跑到這個位置來了 好 再回退一格 又是一個反斜槓b 光標是不是就跑到這兒來了 好 那麼現在光標是在位於這個位置的 這時候我們又輸出一個g空格k 那麼空格就把剛才的那個字符給覆蓋掉了 所以這兒就是g空格k 好 輸出完以後 這時候接著是一個什麼符號 換行符 反斜槓n了 所以這時候光標又跑到下一行的第一列去了 好 那麼我們接著輸出 接著輸出123原樣輸出 然後反斜槓單引號就表示的是單引號本身 所以輸出一個單引號 然後反斜槓雙引號表示的就是雙引號本身 然後反斜槓反斜槓表示的就是反斜槓這一個字符 接著反斜槓x41合在一起是一個字符 就是大寫字母a 然後反斜槓102合起來是一個字符 是大寫字母b 然後再輸出cde 然後換行符 所以最終的我們的這個輸出結果就是這個樣子的 那麼這個例子大家也可以回去編程實現一下 看一下輸出結果是不是我們這兒寫的這個樣子 好 那麼接下來我們來看字符串長量 怎麼表示一個字符串長量呢 其實我們前面都見過 就是用雙引號引起來的一個字符序列就叫做字符串長量 那麼這個雙引號裡面可以寫什麼樣的符號呢 那麼西文字符可以寫 也可以寫中文字符 也可以寫什麼日韓文都可以 就雙引號裡面寫什麼都是可以的 那麼雙引號是字符串長量的一個邊界符 它不是字符串的一個組成部分 也就是雙引號的這個前引號 就說明我這個字符串開始了 後引號表示我這個字符串結束了 所以它是一個字符串的邊界符 那麼下來我們看例子 比如說這個字符串雙引號裡面什麼都沒有 那麼這種字符串叫做空字符串 就裡面沒有字符 然後雙引號裡面一個空格 它就是一個包含一個空格的字符串 那麼空格雖然看不見 但是它也是一個字符呀 然後這個雙引號裡面寫的 Hello 逗號 World 返卸槓n 它就包含了一個這樣的一個字符串 那我們看這個字符串裡面包含了哪幾個字符 X是一個 Y是一個 Z是一個 然後返卸槓101是一個 返卸槓X42是一個 所以它一共包含了五個字符 再看下面一個字符串 返卸槓返卸槓是一個字符 返卸槓單引號是一個字符 返卸槓雙引號是一個字符 返卸槓n又是一個字符 那麼這就是字符串長量它的描述形式 那麼接著我們來看一下符號長量 什麼叫做符號長量呢 它指的就是用一個符號來代替一個長量 就叫做符號長量 那麼符號長量的定義形式是這樣子的 我們用define這個預處理命令來對它進行定義 define後面跟的就是這個標識符 相當於就是給這個長量起一個名字 然後呢再寫上這個長量本身 對吧 比如說我們下面這個例子 井號define price 30 就是我定義了一個符號長量price 用它來表示30這樣一個長量 那麼將來我在程序中要用到30的話 我就可以用price來進行代替 那麼這就是符號長量了 那麼下來我們看一個例子 在這個例子裡面呢 我們看我們在第三行定義了個符號長量π 用它來代表圓周率3.1415926 然後我們在實際編程的時候 r是圓的半徑 它的值為5 然後我們在輸出的時候呢 先輸出圓的周長 那麼就是2×π×r 我們看在這行我們就用π是不是來替代這個3.1415926 然後接著再輸出圓的面積 那麼是πr² 那麼同樣用π來代替這個圓周率 那麼凡是出現π的地方相當於就是出現了3.1415926 那麼可能有同學說這樣做有什麼好處呢 我就寫3.1415926就行了 幹嘛非要定義一個π來代替3.1415926呢 我們說呢使用符號長量有兩個優點 第一個優點就是它可以做到含義清晰 比如我們剛才這個例子 我們這個price我們在構建一個超市管理系統 我們這個price表示的是豬肉的 比如說一公斤豬肉的價格 那麼我給這個30起個名字是price 那麼我一看這個price我就知道 它肯定是一個價格是30塊錢 而不是30個人 也不是30棵樹 所以這樣做是能夠做到含義清晰 我一看這個長量就知道它代表一個什麼含義 這是一方面 另一方面就是可以做到一改全改 比如說下個月我們的豬肉漲價了 由30塊錢每公斤漲到了40塊錢每公斤 那麼我需要做的就是把這個price後面的這個30 把它替換成40就可以了 那麼如果沒有這樣一個符號長量的話 意味著我要在程序裡面找出所有的30 然後一個一個把它們手工改成40 那麼這樣做是很麻煩的 而且我在改的時候還要判斷 這號用的這個30是不是豬肉價格30 也許別的地方也用到了30這個數 如果我要改成40是不是就出現錯誤了 所以它的優點就是可以做到一改全改 因此我們說符號長量是非常有用的 好 那麼長量介紹到這裡 那麼下來我們來介紹變量 那麼什麼叫變量呢 顧名思義這種量在運行期間 它的值是可以改變的 那麼這樣的量我們就稱之為變量 那麼從本質上來說 變量就是計算機中的一個內存單元 就它就是代表計算機中的一塊存儲空間 然後它的值就是放在這塊存儲空間裡面的 那麼C++語言規定變量應該有一個名字 那麼用變量名來代表變量所佔的這個內存單元 那麼這個內存單元到底有多大呢 我們說C++語言通過定義變量時 指定其數據類型來確定內存單元的大小 也就是說數據類型不同 這個變量所佔的存儲空間也是不同的 好 那麼下來我們來看一下變量的這個使用 那麼變量的使用總的來說要先定義後使用 也就是說我要定義了這個變量 這個變量已經存在了 然後我才可以去使用這個變量 我們不能去使用沒有定義過的變量 那麼定義的形式就是數據類型 加上變量名的一個列表 就是我也可以一條語句定義多個變量 比如說下面的例子 我在這條語句裡面定義了4個double型的變量 那麼double A dou B dou C dou D用分號作為結尾 那麼我同時定義了4個double型的變量 那麼double型的變量我們前面提到過 它佔的存儲空間是多少呢 是8個字節 所以系統就會為A B C D每一個 都分配8個字節的存儲空間 好 那麼接著下一條語句 我用整形這個標誌int 定義了3個整形變量i g k 那麼各給它們分配4個字節的存儲空間 那麼下面的這個定義是錯誤的 我們說一條語句只能定義相同類型的變量 不能在一條語句裡面定義多個不同類型的變量 所以這樣的一個定義形式就是錯誤的了 那我們說當變量定義以後 變量的值是不確定的 也就是說變量的值是一個隨機的 那麼直接使用此時的變量參與運算 運算結果也是隨機的 就是我們定義完一個變量以後 那麼這個變量是個整形變量 假設是個整形變量 那麼它裡面就會存放一個隨機的一個整形數 也就是說它是沒有值的 那麼如果你用這個隨機數參與運算的話 那麼運算的結果也是隨機的 是沒有意義的 那麼我們怎麼樣在定義變量的時候 同時能給它放一個值呢 那麼下來我們就看看變量的初始化 所謂變量的初始化指的就是 我在定義這個變量的同時就給它一個初始 讓這個變量在誕生之初就已經有了一個值 那麼初始化的方式就是 變量的數據類型 變量名 變量名的後面加上一個輔制運算符 輔制運算符的右邊就是這個變量的初始了 那麼如果你定義多個變量的話 每個變量的後面都加上一個輔制運算符和它的初始就可以了 我們看例子 比如說double pi=3.1415926分號 就是我在定義這個pi的同時 給了它一個初值3.1415926 那麼在pi誕生之初它就已經有一個明確的值了 那麼在下面一個例子int x,y,k=10 那麼在這個例子裡面我定義了三個變量 但是我只給k附了一個初值 也就是說x和y裡面仍然放的是隨機的一個整數 那麼在下一個例子裡面 a b c我在定義它們的時候都給它們附了一個初值了 那我們再看下面一個錯誤的例子 那麼這個例子錯誤在哪呢 我們看我們是用變量和表達式為變量附初值的 我們說這樣是不可以的 一般來說變量的初值都應該是一個常量 而不能是變量或者表達式 那麼最後一條語句它錯在哪呢 它錯在這個m和n 你這號最後一條語句它其實只定義了一個變量m 然後它試圖把5的值附給z 把z的值附給n 把n的值再附給m 它試圖做這樣一個操作 但是n和z之前定義過沒有 沒有定義過 我們說變量都要先定義後使用 所以這樣的一個操作也是有問題的 好 那麼定義完變量以後就可以給變量附值了 那麼給變量附值的方式就是用輔值運算服 我們前面都見過 就是把一個表達式的值通過輔值運算服附給一個變量 那麼輔值後無論你變量原來的值是多少 都將被新值所取代 也就是新值被完全抹殺掉了舊值 舊值一點痕跡都沒有了 比如說這個例子我定義了個k 我先給它附了個值是5 然後經過一系列操作以後 我又重新給它附一個值是k 那麼這時候k裡面 它的這四個字節存儲空間裡面放的就是10了 而5完全都被抹殺掉了 接下來我們來看一下變量的const限定 我們可以在定義變量的時候 用const對這個變量進行修飾 修飾過的這個變量 我們把它稱為只讀變量或者稱為常變量 為什麼呢 因為這樣的變量它雖然名分上是變量 但實際上它的值已經不能被修改了 它的使用跟常量是一樣的了 那我們看怎麼定義一個常變量 只需要在定義變量的時候 變量類型前面加上一個const就可以了 那我們看下面的例子 定義一個普通變量x 再定義兩個常變量i和g 然後它倆的初值一個是6一個是10 好 那麼接著我們給x重新複製可不可以 可以 因為x是一個普通的變量 我當然可以給它複製了 那麼我們再給i複製可不可以 錯誤 因為i我們剛才定義成一個常變量了 意味著它除了當初始化的時候 給了它一個6的值以後 這個值就不能夠再改變了 所以這條語句是錯的 好 我們再看一個例子 比如說我們這哈定義了一個常變量i 給它初始化為6 沒有問題 那麼下面一條語句 我定義一個常變量m沒有對它進行初始化 這樣的操作也是錯誤的 為什麼呢 因為你這個常變量只有在初始化的時候 你才能給它一個明確的值 因為它後面不能被重新複製了 所以你在定義常變量的時候沒有給它初始化 那麼這樣的操作是不被允許的 那麼Const限定過的變量在編譯過程中 如果發現有修改的操作時會報編譯錯誤 從而阻止對變量的修改 就是說如果你試圖去修改一個常變量的值 那麼你編譯程序的時候是會有錯誤的 那麼使用Const限定強制實現對象最低的訪問權限 是現代軟件開發設計的原則之一 就是其實Const這樣的一種限定是非常有必要的 這個必要性我們體現在哪呢 我們通過一個例子我們來看一下 那麼這個例子我們之前都見過 就是我們當時舉的前面舉過的一個例子 在這個例子裡面有兩個函數 一個是主函數 一個是我們自定義的root函數 那麼這兩個函數之間它有一個調用關係 主函數調用了root這個函數 然後root函數把它的兩個參數的值 傳遞給主函數把它把AB的值 傳遞給root的兩個參數x和y 好 那我們看現在我們把這個程序改了一下 root函數的兩個參數x和y 我們用Const做了一個修飾 也就是說當A和B把值傳給它倆以後 它倆的值就再也不能改了 這樣就使得我在root這個函數題裡面 無法對x和y的值進行了一個修改 那麼對於有一些變量 比如說我x和y表示的是兩個人的性別 那我們知道一個人的性別是不能改變的 那麼這個時候我們就可以把它定義成常變量 那麼使得我們在函數題裡面 不會擔心因為誤操作而改變了它倆的這個值 所以我們說常變量在函數調用過程中 作為參數還是非常有用的這樣的一個量了 好 那麼這一講我們先講到這裡 謝謝大家