最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

第 2 講:數(shù)據(jù)類型初步

2021-08-16 08:15 作者:SunnieShine  | 我要投稿

我們先要掌握一個概念:數(shù)據(jù)類型(Data Type)。世間萬物都有自己獨特的表示方式。例如人的性別只有男、女、其它三種方式就可以完整表達出來,再比如身高只需要是一個正整數(shù)來表示就比較合適了,又比如說話的文字可以用語音的形式呈現(xiàn),也可以用文字形式呈現(xiàn)。在電腦里,每一種想要表示出來的數(shù)據(jù)都有他們自己的數(shù)據(jù)表示機制,這種機制就稱為數(shù)據(jù)類型。

在 C 語言里,我們提供了如下一些類型。

布爾型數(shù)據(jù)在 C 語言委員會在 1999 年才提出該類型的文案,所以 C99 標準才開始支持布爾類型,而現(xiàn)在大多教材使用的還是 ANSI C(C89)標準,即 1989 年的標準,所以教材上給的 C 語言是不支持布爾類型的。

頭暈是吧,我們先來說說,什么叫無符號、什么叫帶符號(有符號)、什么叫字符、什么叫字符串、什么叫布爾、什么叫二進制小數(shù)、什么叫浮點小數(shù)、什么又叫精度。

  • 無符號(Unsigned):非負的;

  • 帶符號(或有符號,Signed):可以表示負數(shù)的;

  • 字符(Character):可以表示出一個普通的英文文本信息的最小單元。這樣說不好理解,你可以認為是“英文所有大小寫字母 + 數(shù)字 + 各種英文標點符號”的集合;

  • 字符串(簡稱,String):一系列字符;

  • 布爾(Boolean):只用來表示真假情況的;

  • 二進制小數(shù)(Binary Decimal):使用二進制格式表達出來的小數(shù);

  • 浮點小數(shù)(Floating Point Decimal):二進制小數(shù)存儲在電腦里的一種存儲機制,類似于科學計數(shù)法,不過是表達為 a \times 2^b 的格式;

  • 精度(Accuracy):表示表達出一個完整數(shù)據(jù)和原始數(shù)據(jù)比較起來的完全精確的程度,在 C 語言里特指小數(shù)轉(zhuǎn)為二進制小數(shù)后,在存放為浮點小數(shù)時,表達出來的數(shù)值和原始數(shù)值相差多少個小數(shù)位。

下面我們來說一下精度和二進制小數(shù)的東西。


精度和二進制小數(shù)

一般在學校里,老師都會講解如何把一個數(shù)字利用二進制表達出來。可它們并沒有講解,如何表示一個小數(shù),以及一個負數(shù)。不過,我會帶領大家認識一下,如何表示一個二進制小數(shù),使用 0 和 1。首先,我們舉個例子。

將 0.15625 轉(zhuǎn)為 0 和 1

表示小數(shù)的方式很簡單。既然表示整數(shù)利用的是除2取整的模式,那么小數(shù)自然就是乘2取余的模式。

%5Cbegin%7Bmatrix%7D%0A0.15625%20%26%20%5Ctimes%20%26%202%20%26%20%3D%20%26%200.3125%20%26%20-%20%26%200%20%26%20%3D%20%26%200.3125%5C%5C%0A0.3125%20%20%26%20%5Ctimes%20%26%202%20%26%20%3D%20%26%200.625%20%20%26%20-%20%26%200%20%26%20%3D%20%26%200.625%5C%5C%0A0.625%20%20%20%26%20%5Ctimes%20%26%202%20%26%20%3D%20%26%201.25%20%20%20%26%20-%20%26%201%20%26%20%3D%20%26%200.25%5C%5C%0A0.25%20%20%20%20%26%20%5Ctimes%20%26%202%20%26%20%3D%20%26%200.5%20%20%20%20%26%20-%20%26%200%20%26%20%3D%20%26%200.5%5C%5C%0A0.5%20%20%20%20%20%26%20%5Ctimes%20%26%202%20%26%20%3D%20%26%201%20%20%20%20%20%20%26%20-%20%26%201%20%26%20%3D%20%26%200%20%26%20(%5Ctext%7B%E7%BB%93%E6%9D%9F%7D)%5C%5C%0A%5Cend%7Bmatrix%7D

大致說一下。從第一步開始,每一次都把數(shù)字乘以 2,得到的結果的整數(shù)部分提取出來,然后做減法,使得數(shù)字一直要保持小于 0 的狀態(tài)。將得到的結果再一次迭代到下一輪計算里。

比如這個示例里,我們把 0.15625 乘以 2,得到 0.3125,整數(shù)部分為 0,把它提取出來,做減法得到 0.3125(因為是減去 0,所以數(shù)字并沒變化),然后把這個數(shù)繼續(xù)乘以 2,得到 0.625,整數(shù)部分為 0,繼續(xù)提取出來,然后用 0.625 乘以 2,得到 1.25,提取整數(shù)部分 1,再將 0.25 乘以 2,繼續(xù)往下做,直到我們得到 0 結束計算。

最終,我們得到的數(shù)字 0、0、1、0、1 即是二進制小數(shù)表達的小數(shù)部分,由于這個數(shù)的整數(shù)部分本來就是 0,所以整數(shù)部分無需我們作更多的二進制表達的轉(zhuǎn)換,所以這個數(shù)的二進制表示就是 0.00101_2。


能遇到十進制表示里的循環(huán)小數(shù)類似的情況嗎?

如果我們嘗試把 0.3 按上述邏輯轉(zhuǎn)換為二進制小數(shù)的時候,就會發(fā)現(xiàn)異樣:

%5Cbegin%7Bmatrix%7D%0A0.3%20%26%20%5Ctimes%20%26%202%20%26%20%3D%20%26%200.6%20%26%20-%20%26%200%20%26%20%3D%20%26%200.6%5C%5C%0A0.6%20%26%20%5Ctimes%20%26%202%20%26%20%3D%20%26%201.2%20%26%20-%20%26%201%20%26%20%3D%20%26%200.2%5C%5C%0A0.2%20%26%20%5Ctimes%20%26%202%20%26%20%3D%20%26%200.4%20%26%20-%20%26%200%20%26%20%3D%20%26%200.4%5C%5C%0A0.4%20%26%20%5Ctimes%20%26%202%20%26%20%3D%20%26%200.8%20%26%20-%20%26%200%20%26%20%3D%20%26%200.8%5C%5C%0A0.8%20%26%20%5Ctimes%20%26%202%20%26%20%3D%20%26%201.6%20%26%20-%20%26%201%20%26%20%3D%20%26%200.6%20%26%20%5Ctext%7B(%E5%9B%9E%E5%88%B0%200.6%20%E7%9A%84%E5%BE%AA%E7%8E%AF)%7D%5C%5C%0A%20%20%20%20%26%20%20%20%20%20%20%20%20%26%20%20%20%26%20%20%20%26%20%5Ctext%7B...%7D%0A%5Cend%7Bmatrix%7D

可以看到,在計算 0.3 的時候,運算總能得到 0.3、0.6、0.2、0.4、0.8、0.6、0.2、0.4、……的序列,后面無窮無盡。所以,0.3 的二進制表示就是 0.0\dot100\dot1_2。


現(xiàn)在再來說精度的問題

正是因為數(shù)字并不能完整轉(zhuǎn)換為準確的二進制表示,比如 0.3,所以表示上一定會存在精度的偏差。比如 0.3 在二進制轉(zhuǎn)換后,由于無窮無盡的關系,我們只能在 float、doublelong double 類型表示完整的二進制位數(shù)后,舍棄掉后面的部分,于是這個數(shù)肯定就不等于原始數(shù)值了。

不過,二進制表達是很復雜的,所以這里我不打算展開講解,有興趣的小伙伴可以看下網(wǎng)上有關 IEEE 754 的標準規(guī)范,這個就是專門規(guī)定如何把小數(shù)表示為二進制表示,存儲到程序里的規(guī)范。

這里告訴大家的是,經(jīng)過這種精心轉(zhuǎn)換的模式后,我們有了如下的結論:

  • float 類型的小數(shù),精度是表示為十進制數(shù)的情況下的 6 或 7 位有效數(shù)字(6 或 7 的其一,詳細情況則取決于二進制表示,這里不展開說明);

  • double 類型的小數(shù),精度是表示為十進制數(shù)的情況下的 14 或 15 位有效數(shù)字;

  • long double 類型取決于系統(tǒng)實現(xiàn),所以這里無法給出精確的范圍,大約精確到 19 位有效數(shù)字。


所占字節(jié)大小

大家都知道,數(shù)據(jù)存儲到電腦里都是以一個叫做“字節(jié)”的單位作為衡量依據(jù)的,那么這些數(shù)據(jù)類型都對應了一個固定的、絕對的字節(jié)數(shù),它就表示元素存進去時,用這個類型就需要占據(jù)多大的內(nèi)存空間的容量。表格如下:

如果你有時候記不住它們的大小,可以用代碼寫成這樣來得到結果:

我們把上面提到的類型代號寫到這里,就可以輸出對應的結果了。比如

因為這些所占字節(jié)數(shù)是可以測出來的,所以一般不要求記住它們,但考試會考,所以這些數(shù)值還是希望你記住,就好像化學元素的相對原子質(zhì)量,常見的是需要作出記憶的。

然后,先不要管這個代碼里的 %d 是啥,稍后會作出解釋。


使用

變量的定義和聲明

在數(shù)學里,表示一個可以變化的數(shù)據(jù)信息是通過變量來表達的,比如 f(x) = 3x^2 + 5x + 7 這個表達式里,x 就是所謂的自變量,而 f(x) 稱為函數(shù),如果寫成 y 則又稱為因變量。在 C 語言里,我們不區(qū)分所謂的自變量和因變量,只要能寫成一個數(shù)值的表示形式,就稱為變量。

變量的形式一般是這樣的:

  1. 數(shù)據(jù)類型 變量名;(簡單聲明)

  2. 數(shù)據(jù)類型 變量名 = 數(shù)值;(賦值數(shù)值常量)

  3. 數(shù)據(jù)類型 變量名 = 計算表達式;(賦值表達式)

  4. 數(shù)據(jù)類型 變量1, 變量2, 變量3;(不賦值)

  5. 數(shù)據(jù)類型 變量1, 變量2 = 多少, 變量3;(不全賦值)

  6. 數(shù)據(jù)類型 變量1 = 多少, 變量2 = 多少, 變量3 = 多少;(全賦值)

比如,一個程序?qū)懗蛇@樣

將得到

其中的 \' 在前文提到過,以 \ 開頭的、寫在雙引號里的內(nèi)容可以表示一個另外意義的表達結果,這里 \'` 表示輸出一個 `'` 符號。然后 `%d` 則在這里表示 `printf` 語句小括號里第一個逗號后的變量的信息結果。這里就表示 `age` 這個變量的數(shù)值(23),然后把 23 替換到雙引號的 `m` 和 `y 之間。

順帶一說,雙引號的內(nèi)容就稱為一個字符串,而每一個字母(包括空格、\' 等等符號,都表示一個字符)。


變量的自定義輸入

再拿出 int 作為數(shù)據(jù)類型舉例。既然有輸出就應該由輸入。如果需要我們自己輸進去一個數(shù)字,然后程序輸出這個結果,就需要用到新的寫法:scanf 語句。

這樣就可以了。注意 scanf 語句的寫法,逗號后跟的 age 變量必須要在前面加前綴符號 &,這一點在后面再說。

可以發(fā)現(xiàn),C 語言是一種比較奇特的語言,它的大多數(shù)語法的耦合度較高,即前面的知識點要用超綱的內(nèi)容做鋪墊,而后面的知識點卻又依賴于前面的知識點,所以……寫教程真的很傷腦筋啊……

當然,scanf 語句也可以同時為多個變量賦值。比如

請注意,每一個變量后都得加 & 前綴符號,而且在運行程序的時候,你必須得跟著這個字符串里寫的格式寫,比如這個字符串 %d, %d 里含有一個數(shù)、逗號、空格和一個數(shù),所以你在輸入的時候必須格外小心,照著這個格式寫內(nèi)容:

上述四種格式都是正確的。另外需要注意的是,scanf 語句甚至不以換行作為分割,所以你可以這么輸入:

這樣的書寫格式里所有的換行都是不被讀取的,所以你的所有換行都會被“抹掉”,故這種格式最終還是

但如果沒有嚴格按照格式書寫,比如

這些格式都是錯的,最終只有 a 會正確得到 12,而 b 依舊是沒有數(shù)值的。

當然,你也可以分寫兩句:

不過后者寫起來怪麻煩的。

切記,字符串里帶有空格的 scanf 語句,在運行程序時,你也要在輸入完第一個數(shù)據(jù)時,空一格輸入第二個數(shù)據(jù)。當然,后者這種格式,在輸入的時候可以用回車的方式分割兩個輸入數(shù)據(jù)。


格式化字符串的定義和使用

下面還要來看看,什么是格式化字符串(Formatting String)。其實,說白了,前文出現(xiàn)的 %d 就是格式化字符串的一種。但請注意,它只是其中一種,如果你把它認為是輸出數(shù)值結果的話,那就錯了。所有的格式化字符串如下。

要把數(shù)據(jù)輸入到電腦里面去,我們需要用到的是C語言自帶的輸入功能,寫法也有兩種不同的類型:

這樣就表示輸入一個小數(shù),然后利用這個叫做格式化字符串的東西給它把輸入的“黑框”上面顯示的那個數(shù)字字符改變?yōu)樾?shù)的數(shù)據(jù),便于放置到prize所在的位置上去,既然是所在位置,所以需要用到&了,這個符號就是專門用來找位置的。

另需要你記憶一些格式化字符串的寫法:

大家只需要記住前面四種和最后兩種就可以了。

如果我又定義了一個變量,是 int,就用 %d 轉(zhuǎn)為整數(shù)存放到電腦之中。

比如

就將整數(shù)變量 a 輸入到電腦里面用整數(shù)規(guī)范存儲了。如果格式化字符串用成其他的,比如 %f,結果就很怪異。所以一定要配套。

輸入兩次的話,可以簡寫成一次輸入:

注意,scanf 語句的字符串里中間最好要有字符。說白了就是不要寫成 %d%d 挨在一起的寫法。如果不給空格雖然程序不會出錯,但是這樣讓容易出現(xiàn)安全漏洞,諸如緩存區(qū)溢出等。


格式化字符串的排版控制

因為是在控制臺界面運行的,所以空格就可以用來排版了,不過有些時候,比如我們想讓某個數(shù)輸出的時候有對齊的效果,就會按情況來計算占據(jù)的顯示的格數(shù)。比如一個兩位數(shù)一定是占兩格的,如果我們強制讓所有輸出的數(shù)值都占三格呢?

我們可以在 %d 之間添加數(shù)值以控制占的格數(shù)。比如 %2d 表示占兩格,%6d 表示占六格。如果位數(shù)不夠的,前面會有空格占位。比如說

輸出的樣子就是

就很好看。小數(shù)的話,除了可以控制輸出的占格數(shù),還可以控制輸出的小數(shù)位數(shù),如果你不希望小數(shù)位后很多零的話,可以這么寫:%占格數(shù).小數(shù)位格數(shù)f,是可以的。占格數(shù)是計算這個輸入的字符一共有多少個,而不是整數(shù)位多少位。比如

將輸出

特別要注意前面的空格。

如果是輸入里插入這樣的格式化字符串的話,則會嚴格按照這樣的標準執(zhí)行輸入,如果超出范圍的部分會被直接舍棄掉,或是拿給下一個部分使用。比如

那么提示輸入的時候,如果輸入的是 12345 的話,由于前面 %3d 的控制,后面的 45 會被切掉,而 b 恰好要兩位數(shù),所以 a 為 123,b 是 45,輸出也是一樣。

但如果超出了范圍,比如輸入了 123456,則依然結果是 123 和 45,6 會被舍棄。

最后講一下這些語句的寫法規(guī)范。


規(guī)范

代碼格式規(guī)范

其實呢,編譯器這位翻譯官將你的 C 語言代碼給它轉(zhuǎn)變?yōu)橄到y(tǒng)能夠識別和操作的語言之前,會給你的代碼進行排版,這個時候,分號這些就顯得額外重要。

一句話一定要用分號結尾,表示你這個操作做完了。不過換行不是必須有的,你可以把代碼全寫在一行,也可以換行寫,只要有分號怎么寫都無所謂,但是為了代碼好看整潔,建議換行。

這樣當然可以了,不過肯定不好看!


標識符命名規(guī)范

在前文里我們提到了標簽和變量,它們都遵循一個命名規(guī)則。這個規(guī)則保證了程序正確的執(zhí)行。命名規(guī)范其實在前文已經(jīng)說到了。

  1. 數(shù)字、字母、下劃線 _ 三者的組合;

  2. 第一個字符不能是數(shù)字;

  3. 不能是前文用到過的那些 C 語言自帶的字符組合,如 int 等(注意,此時 scanf 還不是 C 語言固有的東西,也就是說你可以把 scanf、printf、main 這種東西定義為變量名,但完全不建議這么做)。

只要滿足這 3 點就可以了。比如 helloage、test_01T_T、o_O 都是正確的標識符,而 2_4^_^ 則不行。但建議名字取得有意義,因為下文可能會用到它們,取一個有意義的名字對語義理解有幫助。


類型規(guī)范

可以在上文看到很多有關變量的定義的語句。但可以發(fā)現(xiàn)到的是,大多整數(shù)類型的變量全部被定義為了 int,而在后面的很多內(nèi)容里也會這么干。你可能會問,雖然 int 的范圍較大,且包含大多我們常見的元素的量,但 int 存儲的字節(jié)數(shù)(占的空間大?。╋@然比 short 這些類型要大上一倍,甚至比 char 大上三倍,那為什么像是年齡這種東西不用 short 類型,甚至是更精確的 unsigned short 類型存儲呢?年齡一般在 150 以下,而且 short 的范圍最大到 32767,顯然是夠用的。

原因在于,int 是非常常用的數(shù)據(jù)類型,這其實算作一種習慣性使用。上文提到的說法是正確而且合理的,但一般我們出于計算和兼容性而言,用 int 居多。所以,如果你覺得確實需要降低內(nèi)存使用,或者 int 不夠用的話,才確定具體的使用類型,而一般都盡量使用 int 類型。


第 2 講:數(shù)據(jù)類型初步的評論 (共 條)

分享到微博請遵守國家法律
定西市| 新宁县| 垦利县| 岑巩县| 新和县| 乡城县| 驻马店市| 宾阳县| 鹤壁市| 杂多县| 攀枝花市| 兴国县| 潜江市| 宝清县| 青铜峡市| 汕头市| 达拉特旗| 白银市| 沈丘县| 平顺县| 六盘水市| 泉州市| 陇南市| 武冈市| 冀州市| 松潘县| 杭锦后旗| 华坪县| 阿巴嘎旗| 嘉善县| 邛崃市| 蒲城县| 额济纳旗| 和顺县| 修水县| 喜德县| 阜康市| 米林县| 育儿| 易门县| 惠州市|