【C語(yǔ)言入門到精通】04 數(shù)據(jù)類型

If a program manipulates a large amount of data, it does so in a small number of ways.[1]

碼字不易吹零,對(duì)你有幫助 點(diǎn)贊:thumbsup:/轉(zhuǎn)發(fā):arrow_right_hook:/關(guān)注 :eyes: ** 支持一下作者
微信搜公眾號(hào):
不會(huì)編程的程序圓**
看更多干貨,獲取第一時(shí)間更新

想看更好的文章排版壮啊,可以閱讀原文:
【C語(yǔ)言入門到精通】04 數(shù)據(jù)類型

思維導(dǎo)圖


image

寫(xiě)在前面


如果只是寫(xiě)個(gè)人學(xué)習(xí)總結(jié)的博客很容易株汉,簡(jiǎn)單寫(xiě)一些感悟然后貼上代碼走人就可以了厦章,甚至不用校審雀费。但是我命名本系列為【C語(yǔ)言必知必會(huì)】幫助你從入門到精通 C語(yǔ)言比肄,那勢(shì)必要“事無(wú)巨細(xì)”一些:既要考慮到?jīng)]有基礎(chǔ)的初學(xué)者男翰,又不能止于基礎(chǔ)另患。所以本教程適合各類人群學(xué)習(xí),只要你看就一定會(huì)有幫助蛾绎。

本教程是本人純手打并排版昆箕,校審由我與我的搭檔湯圓君一起完成的。你們看這一篇文章我要寫(xiě)好幾個(gè)小時(shí)租冠。如果文章對(duì)你有幫助鹏倘,請(qǐng)不要“白嫖”。支持一下作者肺稀,作者會(huì)發(fā)更多干貨好文第股。

特別鳴謝:湯圓君(公眾號(hào):【Cc聽(tīng)香水榭】 長(zhǎng)期更新高質(zhì)量英語(yǔ)教學(xué))關(guān)注她表示對(duì)她工作的認(rèn)可吧!

》 此符號(hào)表示該內(nèi)容以后的章節(jié)會(huì)講解话原,此章節(jié)內(nèi)不要求理解夕吻。

目錄


[toc]

一 概述


關(guān)鍵字

C語(yǔ)言的數(shù)據(jù)類型關(guān)鍵字

最初 K&R 給出的關(guān)鍵字 C90標(biāo)準(zhǔn)添加的關(guān)鍵字 C99標(biāo)準(zhǔn)添加的關(guān)鍵字
int signed _Bool (布爾型)
short void _Complex(復(fù)數(shù))
long _Imaginary(虛數(shù))
unsigned
char
float
double

通過(guò)這些關(guān)鍵字創(chuàng)建的類型,按計(jì)算機(jī)的存儲(chǔ)方式可分為兩大基本類型:整數(shù)類型浮點(diǎn)數(shù)類型

位繁仁,字節(jié)和字

位涉馅,字節(jié)和字

位(bit): 最小的存儲(chǔ)單元,也稱比特位黄虱≈煽螅可以存儲(chǔ) 0 或 1(或者說(shuō),位用于存儲(chǔ)“開(kāi)”或“關(guān)”)

字節(jié)(byte): 1 byte = 8 bit 既然 1 位可以表示 0 或 1捻浦,那么 1 字節(jié)就有 256 (2^8)種 0/1 組合晤揣,通過(guò)二進(jìn)制編碼(僅用 0/1 便表示數(shù)字),便可表示 0 ~ 255 的整數(shù)或一組字符朱灿。(以后會(huì)詳細(xì)講解

字(word): 是設(shè)計(jì)計(jì)算機(jī)時(shí)給定的自然存儲(chǔ)單位昧识。對(duì)于 8 位 的微型計(jì)算機(jī)(如:最初的蘋(píng)果機(jī)),1 字長(zhǎng) 只有 8 位盗扒,從那以后跪楞,個(gè)人計(jì)算機(jī)的字長(zhǎng)增至 16 位缀去,32位,直至目前的 64位甸祭。計(jì)算機(jī)字長(zhǎng)越大缕碎,其數(shù)據(jù)轉(zhuǎn)移越快,允許訪問(wèn)的內(nèi)存越多池户。

整數(shù)

整數(shù) 7 以二進(jìn)制形式表示是:111 咏雌,用一個(gè)字節(jié)存儲(chǔ)可表示為:

image

浮點(diǎn)數(shù)

浮點(diǎn)數(shù)相比我們都不陌生,本節(jié)后面還會(huì)做更詳細(xì)的介紹∩烽荩現(xiàn)在我們介紹一種浮點(diǎn)數(shù)的表示方法:e記數(shù)法处嫌。

如 3.16E+007 表示 3.16 * 10^7(3.16乘以10的七次方)。007 表示 10^7斟湃;+ 表示 10 的指數(shù) 7 為正數(shù)熏迹。

其中,E 可以寫(xiě)成 e凝赛;表示正次數(shù)時(shí)注暗,+ 號(hào)可以省略;007也可以省略為7墓猎。即:3.16e7捆昏。

浮點(diǎn)數(shù)和整數(shù)的存儲(chǔ)方案是不同的。計(jì)算機(jī)將浮點(diǎn)數(shù)分成小數(shù)部分和指數(shù)部分來(lái)表示毙沾,而且分開(kāi)存儲(chǔ)這兩部分骗卜。因此,雖然 7.0 和 7 在數(shù)值上相同左胞,但它們的存儲(chǔ)方式不同寇仓。下圖演示了一個(gè)存儲(chǔ)浮點(diǎn)數(shù)的例子。后面我們會(huì)做更詳細(xì)的解釋

image

整數(shù)與浮點(diǎn)數(shù)的區(qū)別:

  • 整數(shù)沒(méi)有小數(shù)部分烤宙,浮點(diǎn)數(shù)有小數(shù)部分
  • 浮點(diǎn)數(shù)可以表示的范圍比整數(shù)大
  • 對(duì)于一些算術(shù)運(yùn)算(如遍烦,兩個(gè)很大的數(shù)相減),浮點(diǎn)數(shù)損失的精度更多
  • 因?yàn)樵谌魏螀^(qū)間內(nèi)都存在無(wú)窮多個(gè)實(shí)數(shù)躺枕,所以計(jì)算機(jī)的浮點(diǎn)數(shù)不能表示區(qū)間內(nèi)的所有值服猪。浮點(diǎn)數(shù)通常只是實(shí)際值的近似值。(例如拐云,7.0 可能被存儲(chǔ)為浮點(diǎn)值 6.99999)
  • 過(guò)去罢猪,浮點(diǎn)數(shù)運(yùn)算比整數(shù)運(yùn)算慢。不過(guò)現(xiàn)在許多CPU都包含了浮點(diǎn)數(shù)處理器叉瘩,縮小了速度上的差距膳帕。

二 整數(shù)類型


有符號(hào)整數(shù)和無(wú)符號(hào)整數(shù)

有符號(hào)整數(shù)如果為零或正數(shù),那么最左邊的位(符號(hào)位房揭,只表示符號(hào)备闲,不表示數(shù)值)為 0 ;如果為負(fù)數(shù)捅暴,則符號(hào)位為 1恬砂。如:最大的 16 位整數(shù)(2個(gè)字節(jié))的二進(jìn)制表示形式是 01111111 11111111,對(duì)應(yīng)的數(shù)值是 32767(即:2^15 - 1)

無(wú)符號(hào)整數(shù) 不帶符號(hào)位(最左邊的位是數(shù)值的一部分)蓬痒。因此泻骤,最大的 16 位整數(shù)的二進(jìn)制表示形式是:11111111 11111111(即:2^16 - 1)

默認(rèn)情況下,C語(yǔ)言中的整型變量都是有符號(hào)的梧奢,也就是說(shuō)最左位保留符號(hào)位狱掂。若要告訴編譯器變量沒(méi)有符號(hào)位,需要把他聲明成 unsigned 類型亲轨。

整數(shù)的類型

short int

unsigned short int

int

unsigned int

long int

unsigned long int

整數(shù)的類型歸根結(jié)底只有這 6 種趋惨,其他組合都是上述某種類型的同義詞。

例如:long signed int 與 long int 是一樣的惦蚊;unsigned short int 與 short unsigned int 是一樣的

C語(yǔ)言允許通過(guò)省略單詞 int 來(lái)縮寫(xiě)整數(shù)類型的名稱器虾。

例如:unsigned short int 可以縮寫(xiě)為 unsigned short ;而 long int 可以縮寫(xiě)為 long蹦锋。

C程序員經(jīng)常省略 int 兆沙。

6 種 整數(shù)類型每一種所表示的取值范圍都會(huì)根據(jù)機(jī)器的不同而不同,但是有兩條所有編譯器都必須遵守的原則莉掂。

  • C 標(biāo)準(zhǔn)要求 short葛圃,int,long 中的每一種類型都要覆蓋一個(gè)確定的最小取值范圍(后面會(huì)詳細(xì)講解
  • int 類型不能比 short 類型短憎妙,long 類型不能比 int 類型短

這也就是說(shuō):short 的大小可以與 int 相等库正;int 的大小可以與 long 相等

16位,32位尚氛,64位機(jī)器的整數(shù)類型都各有些不同诀诊,我們常用的是 32 位機(jī)器(嚴(yán)格來(lái)說(shuō)是編譯器,我的電腦是 64 位阅嘶,但是VS2019用的最多的是 32位模式)属瓣,我們就以 32 位機(jī)器為例

32位機(jī)器整數(shù)類型

類型 最小值 最大值
short -32768( - 2^15 ) 32767(2^15 -1 )
unsigned short 0 65535 (2^16 - 1)
int - 2147483648(- 2^31) 2147483647(2^31 - 1)
unsigned int 0 4294967295
long - 2147483648 2147483647
unsigned long 0 4294967295

可以看出,32位機(jī)器上讯柔,int 與 long的大小是一樣的抡蛙,都是 4 個(gè)字節(jié)。

16位機(jī)器上魂迄,int 與 short 大小是一樣的粗截,都是 2 個(gè)字節(jié)。

64位機(jī)器上捣炬,與 32 位機(jī)器不同的是熊昌,long 是 8 個(gè)字節(jié)绽榛。

但是,上述所說(shuō)的規(guī)律并不是 C標(biāo)準(zhǔn)規(guī)定的婿屹,會(huì)隨著編譯器的不同而不同灭美。可以檢查頭文件<limits.h>昂利,來(lái)查看每種整數(shù)類型的最大值和最小值届腐。(下面給出我的VS2019的 limits.h 頭文件)

limits.h

#pragma once
#define _INC_LIMITS

#include <vcruntime.h>

_CRT_BEGIN_C_HEADER



#define CHAR_BIT      8         // number of bits in a char 
#define SCHAR_MIN   (-128)      // minimum signed char value
#define SCHAR_MAX     127       // maximum signed char value
#define UCHAR_MAX     0xff      // maximum unsigned char value

#ifndef _CHAR_UNSIGNED
    #define CHAR_MIN    SCHAR_MIN   // mimimum char value
    #define CHAR_MAX    SCHAR_MAX   // maximum char value
#else
    #define CHAR_MIN    0
    #define CHAR_MAX    UCHAR_MAX
#endif

#define MB_LEN_MAX    5             // max. # bytes in multibyte char
#define SHRT_MIN    (-32768)        // minimum (signed) short value
#define SHRT_MAX      32767         // maximum (signed) short value
#define USHRT_MAX     0xffff        // maximum unsigned short value
#define INT_MIN     (-2147483647 - 1) // minimum (signed) int value
#define INT_MAX       2147483647    // maximum (signed) int value
#define UINT_MAX      0xffffffff    // maximum unsigned int value
#define LONG_MIN    (-2147483647L - 1) // minimum (signed) long value
#define LONG_MAX      2147483647L   // maximum (signed) long value
#define ULONG_MAX     0xffffffffUL  // maximum unsigned long value
#define LLONG_MAX     9223372036854775807i64       // maximum signed long long int value
#define LLONG_MIN   (-9223372036854775807i64 - 1)  // minimum signed long long int value
#define ULLONG_MAX    0xffffffffffffffffui64       // maximum unsigned long long int value

#define _I8_MIN     (-127i8 - 1)    // minimum signed 8 bit value
#define _I8_MAX       127i8         // maximum signed 8 bit value
#define _UI8_MAX      0xffui8       // maximum unsigned 8 bit value

#define _I16_MIN    (-32767i16 - 1) // minimum signed 16 bit value
#define _I16_MAX      32767i16      // maximum signed 16 bit value
#define _UI16_MAX     0xffffui16    // maximum unsigned 16 bit value

#define _I32_MIN    (-2147483647i32 - 1) // minimum signed 32 bit value
#define _I32_MAX      2147483647i32 // maximum signed 32 bit value
#define _UI32_MAX     0xffffffffui32 // maximum unsigned 32 bit value

// minimum signed 64 bit value
#define _I64_MIN    (-9223372036854775807i64 - 1)
// maximum signed 64 bit value
#define _I64_MAX      9223372036854775807i64
// maximum unsigned 64 bit value
#define _UI64_MAX     0xffffffffffffffffui64

#if _INTEGRAL_MAX_BITS >= 128
    // minimum signed 128 bit value
    #define _I128_MIN   (-170141183460469231731687303715884105727i128 - 1)
    // maximum signed 128 bit value
    #define _I128_MAX     170141183460469231731687303715884105727i128
    // maximum unsigned 128 bit value
    #define _UI128_MAX    0xffffffffffffffffffffffffffffffffui128
#endif

#ifndef SIZE_MAX
    #ifdef _WIN64
        #define SIZE_MAX _UI64_MAX
    #else
        #define SIZE_MAX UINT_MAX
    #endif
#endif

#if __STDC_WANT_SECURE_LIB__
    #ifndef RSIZE_MAX
        #define RSIZE_MAX (SIZE_MAX >> 1)
    #endif
#endif



_CRT_END_C_HEADER

C99 中的整數(shù)類型

C99 提供了兩個(gè)額外的整數(shù)類型:long long intunsigned long long int

整數(shù)常量

整數(shù)常量:在程序中以文本形式出現(xiàn)的數(shù),而不是讀蜂奸,或計(jì)算出來(lái)的數(shù)犁苏。

C語(yǔ)言允許用 十進(jìn)制(基數(shù)為 10),八進(jìn)制(基數(shù)為 8)扩所,十六進(jìn)制(基數(shù)為 16)的形式書(shū)寫(xiě)整數(shù)常量

8 進(jìn)制 與 16 進(jìn)制

8 進(jìn)制數(shù)是用數(shù)字 0 ~ 7 書(shū)寫(xiě)的围详。八進(jìn)制的每一位表示一個(gè) 8 的冪(這就如同 10 進(jìn)制每一位表示 10 的冪一樣)。因此祖屏,八進(jìn)制數(shù) 237 表示成 10 進(jìn)制數(shù)就是 2 * 8^2 + 3 * 8^1 + 7 * 8^0 = 128 + 24 + 7 = 159

16 進(jìn)制數(shù)使用數(shù)字 0 ~ 9 加上字符 A ~ F 書(shū)寫(xiě)的短曾,其中字符 A ~ F 表示 10 ~ 15 的數(shù)。16進(jìn)制數(shù)每一位表示一個(gè) 16 的冪赐劣,16進(jìn)制數(shù) 1AF 的十進(jìn)制數(shù)值是 1 x 16^2 + 10 * 16^1 + 15 * 16^0 = 256 + 160 + 15 = 431

如果上面的描述你還是沒(méi)有懂嫉拐,可以參考下圖:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-ziyXqpwQ-1585358279189)(C:\Users\1\Desktop\素材\27.png)]

  • 十進(jìn)制常量包含 0 ~ 9 的數(shù)字,但是不能以 0 開(kāi)頭

    15 255 32767

  • 八進(jìn)制常量包含 0 ~ 7 的數(shù)字魁兼,必須要以 0 開(kāi)頭

    017 0377 077777

  • 十六進(jìn)制常量包含 0 ~ 9 的數(shù)字 和 A ~ F 的字母婉徘,總是以 0x 開(kāi)頭

    0xf 0xff 0x7fff

    十六進(jìn)制常量中的字母可以是大寫(xiě)也可以是小寫(xiě)

#include<stdio.h>

int main(void) {

    int x = 100;

    printf("decimal = %d    octonary = %o   hexadecimal = %x \n", x, x, x);
    printf("decimal = %d    octonary = %#o  hexadecimal = %#x \n", x, x, x);
    return 0;
}

輸出:

decimal = 100   octonary = 144  hexadecimal = 64
decimal = 100   octonary = 0144 hexadecimal = 0x64

八進(jìn)制與十六進(jìn)制只是書(shū)寫(xiě)數(shù)的方式,他們不會(huì)對(duì)數(shù)的實(shí)際存儲(chǔ)方式產(chǎn)生影響整數(shù)都是以二進(jìn)制形式存儲(chǔ)的)咐汞。任何時(shí)候都可以從一種書(shū)寫(xiě)方式切換的另一種盖呼,甚至可以混合使用:10 + 015 + 0x20 = 55 。八進(jìn)制和十六進(jìn)制更適合底層程序的編寫(xiě)(以后會(huì)詳細(xì)講到)化撕。

十進(jìn)制整數(shù)常量的類型通常是 int 几晤,但如果常量過(guò)大,就用 long int 類型植阴,如果還不夠用蟹瘾,編譯器會(huì)用 unsigned long int 做最后嘗試。

八進(jìn)制和十六進(jìn)制常量編譯器會(huì)依次嘗試:int掠手,unsigned int憾朴,long int 和 unsigned long int 類型,知道找到能表示該常量的類型喷鸽。

為了強(qiáng)制編譯器把常量作為長(zhǎng)整數(shù)來(lái)處理众雷,只需要在后面加上一個(gè)字母L(或l,字母l比較像數(shù)字1所以建議大寫(xiě)):

15L 0377L 0x7ffffL

為了指明是無(wú)符號(hào)常量,可以在常量后面加上字母U(或u):

15U 0377U 0x7ffffU

L 與 U 可以結(jié)合使用:0xffffffffLU(L 與 U 的書(shū)寫(xiě)順序無(wú)所謂)

C99 中的整數(shù)常量

在 C99 中砾省,以 LL 或 ll (字母大小寫(xiě)要一致)結(jié)尾的整數(shù)常量是 long long int 類型鸡岗。在 LL 或 ll 前面或后面加上 U(u)表示 unsigned long long int 類型。

C99 與 C89 在確定整數(shù)常量類型規(guī)則上有些不同编兄。

對(duì)于沒(méi)有后綴的十進(jìn)制常量纤房,其類型是 int ,long int翻诉,long long int 中能表示該值的 最小類型。

對(duì)于八進(jìn)制和十六進(jìn)制常量捌刮,可能的類型順序?yàn)椋篿nt碰煌,unsigned int,long int绅作,unsigned long int芦圾,long long int,unsigned long long int。

常量后面任何后綴都會(huì)改變可能的類型列表俄认。

整數(shù)溢出

對(duì)整數(shù)執(zhí)行算數(shù)運(yùn)算時(shí)个少,其結(jié)果可能太大而無(wú)法表示。例如眯杏,對(duì)兩個(gè) int 值進(jìn)行算數(shù)運(yùn)算時(shí)夜焦,其結(jié)果必須仍然能用 int 來(lái)表示;否則(表示結(jié)果所需要的數(shù)位(二進(jìn)制)太多)岂贩,就會(huì)發(fā)生溢出茫经。

有符號(hào)整數(shù)的溢出時(shí),程序的行為時(shí)未定義的萎津。未定義行為的結(jié)果是不確定的卸伞。最有可能的結(jié)果是,僅僅是運(yùn)算出錯(cuò)锉屈,但是程序也有可能崩潰荤傲,或者出現(xiàn)其他意想不到的情況。

無(wú)符號(hào)整數(shù)溢出時(shí)颈渊,結(jié)果是有定義的:對(duì) 2^n 取模遂黍,其中 n 是用于存儲(chǔ)結(jié)果的位數(shù)。例如:如果對(duì)無(wú)符的 16 位數(shù) 65535 加 1俊嗽,其結(jié)果可以保證為 0 妓湘。

請(qǐng)看下面的程序,也許可以幫助你理解乌询。

tobig.c —— 超出系統(tǒng)最大 int 值

#include<stdio.h>

int main(void) {

    int i = 2147483647;
    unsigned int j = 4294967295;

    printf("%d  %d  %d\n", i, i + 1, i + 2);
    printf("%u  %u  %u\n", j, j + 1, j + 2);

    return 0;
}

輸出:

2147483647      -2147483648     -2147483647
4294967295      0       1

可以將無(wú)符號(hào)整型 j 看作是汽車的里程表榜贴。當(dāng)達(dá)到他能表示的最大值時(shí),會(huì)重新從起點(diǎn)開(kāi)始。整數(shù) i 也是類似的情況唬党。它們的主要區(qū)別是鹃共,在超過(guò)最大值時(shí), unsigned int 類型的變量 j 從 0 開(kāi)始驶拱;而 int 型的變量則從 -2147483648 開(kāi)始霜浴。注意,當(dāng) i 超出(溢出)其相對(duì)類型所能表示的最大值時(shí)蓝纲,系統(tǒng)并未通知用戶阴孟。因此必須自己注意這類問(wèn)題。

讀/寫(xiě)整數(shù)

讀寫(xiě)無(wú)符號(hào)整數(shù)

unsigned int a;

  • 十進(jìn)制

    scanf("%u", &a);

    printf("%u", a);

  • 八進(jìn)制

    scanf("%o", &a);

    printf("%o", a);

  • 十六進(jìn)制

    scanf("%x", &a);

    printf("%x", a);

讀寫(xiě)*短整型數(shù):在 d税迷,u永丝,o,x 前加上 h

short b

  • scanf("%hd", &b);

    printf("%hd", b);

讀寫(xiě)長(zhǎng)整數(shù):在 d箭养,u慕嚷,o,x 前加上 l

long c

  • scanf("%ld", &c);

    printf("%ld", c);

讀寫(xiě)長(zhǎng)長(zhǎng)整數(shù): 在 d毕泌,u喝检,o,x 前加上 ll

long long int d

  • scanf("%lld", &d);

    printf("%lld", d);

改進(jìn)程序
#include<stdio.h>

int main(void){
    
    int a, b, sum;
    
    printf("Enter two integers:\n");
    scanf("%d %d", &a, &b);
    
    sum = a + b;
    
    printf("The sum is %d\n", sum);
    return 0;
}

觀察上述程序撼泛,請(qǐng)思考:兩個(gè) int 型的變量的和可能超過(guò) int型變量允許的最大值挠说。因此,為了改進(jìn)這個(gè)程序愿题,我們可以將 int 型的 a纺涤,b,sum 都變?yōu)?long long 型(考慮到 32 位機(jī)器的 long 與 int 大小是相同的抠忘。)如下:

int main(void) {

    long long a, b, sum;

    printf("Enter two integers:\n");
    scanf("%lld %lld", &a, &b);

    sum = a + b;

    printf("The sum is %lld\n", sum);
    return 0;
}

三 浮點(diǎn)類型


C語(yǔ)言提供了三種浮點(diǎn)類型撩炊,對(duì)應(yīng)著不同的浮點(diǎn)格式:

  • float:單精度浮點(diǎn)數(shù)
  • double:雙精度浮點(diǎn)數(shù)
  • long double:擴(kuò)展精度浮點(diǎn)數(shù)

通常我們用到的是 double

自己編譯器 的浮點(diǎn)特征(浮點(diǎn)類型的范圍)可以在float.h頭文件內(nèi)查看。下面給出我的 VS2019 的 float 頭文件的部分內(nèi)容崎脉。

float.h

#define DBL_DECIMAL_DIG  17                      // # of decimal digits of rounding precision
#define DBL_DIG          15                      // # of decimal digits of precision
#define DBL_EPSILON      2.2204460492503131e-016 // smallest such that 1.0+DBL_EPSILON != 1.0
#define DBL_HAS_SUBNORM  1                       // type does support subnormal numbers
#define DBL_MANT_DIG     53                      // # of bits in mantissa
#define DBL_MAX          1.7976931348623158e+308 // max value
#define DBL_MAX_10_EXP   308                     // max decimal exponent
#define DBL_MAX_EXP      1024                    // max binary exponent
#define DBL_MIN          2.2250738585072014e-308 // min positive value
#define DBL_MIN_10_EXP   (-307)                  // min decimal exponent
#define DBL_MIN_EXP      (-1021)                 // min binary exponent
#define _DBL_RADIX       2                       // exponent radix
#define DBL_TRUE_MIN     4.9406564584124654e-324 // min positive value

#define FLT_DECIMAL_DIG  9                       // # of decimal digits of rounding precision
#define FLT_DIG          6                       // # of decimal digits of precision
#define FLT_EPSILON      1.192092896e-07F        // smallest such that 1.0+FLT_EPSILON != 1.0
#define FLT_HAS_SUBNORM  1                       // type does support subnormal numbers
#define FLT_GUARD        0
#define FLT_MANT_DIG     24                      // # of bits in mantissa
#define FLT_MAX          3.402823466e+38F        // max value
#define FLT_MAX_10_EXP   38                      // max decimal exponent
#define FLT_MAX_EXP      128                     // max binary exponent
#define FLT_MIN          1.175494351e-38F        // min normalized positive value
#define FLT_MIN_10_EXP   (-37)                   // min decimal exponent
#define FLT_MIN_EXP      (-125)                  // min binary exponent
#define FLT_NORMALIZE    0
#define FLT_RADIX        2                       // exponent radix
#define FLT_TRUE_MIN     1.401298464e-45F        // min positive value

如果你的編譯器 float 和 double 的最大值和最小值和我的一樣拧咳,說(shuō)明你的編譯器也是支持 IEEE標(biāo)準(zhǔn)的(大多數(shù)計(jì)算機(jī)都是遵循 IEEE 754標(biāo)準(zhǔn))。

浮點(diǎn)常量

浮點(diǎn)常量可以有多種寫(xiě)法囚灼。例如骆膝,下面這些寫(xiě)法都表示數(shù) 57.0

57.0 57. 57.0e0 5.7e1 5.7e+1 .57e2 570.e-1

浮點(diǎn)常量必須包含小數(shù)點(diǎn)或指數(shù)

默認(rèn)情況下,浮點(diǎn)常量都以雙精度的形式存儲(chǔ)灶体。換句話說(shuō)阅签,當(dāng) C語(yǔ)言的編譯器在程序中發(fā)現(xiàn)常量 57.0 時(shí),它會(huì)安排數(shù)據(jù)以 double 類型變量的格式存儲(chǔ)在內(nèi)存中蝎抽。

如果只需要單精度政钟,可以在常量末尾加上 Ff(如 57.0F);如果想以 long double 格式存儲(chǔ),在常量尾加上 Ll(如 57.0L)

讀/寫(xiě)浮點(diǎn)數(shù)

  • float: %e %f %g

  • double: %lf

    • scanf("%lf", &varible);

    • printf("%f", varible);

      lf格式串 只能在 scanf 中使用养交;在用 printf 輸出 double 時(shí)精算,格式串可以使用 e,f,g

  • long double: %Lf

    • scanf("%Lf", &varible);
    • printf("%Lf", varible);

四 字符類型


字符類型(字符型):char

char 類型的值可以根據(jù)計(jì)算機(jī)的不同而不同碎连,因?yàn)椴煌挠?jì)算機(jī)可能會(huì)有不同的字符集灰羽。

字符集:當(dāng)今最常用的字符集是 ASCII (美國(guó)信息交換標(biāo)準(zhǔn)碼)字符集。

image

字符操作

C語(yǔ)言把字符當(dāng)作小整數(shù)進(jìn)行處理鱼辙。

所有字符都是以二進(jìn)制形式進(jìn)行編碼的廉嚼。

在標(biāo)準(zhǔn)的 ASCII 碼中,字符的取值范圍是 00000000 ~ 01111111倒戏,可以看成是 0 ~ 127 怠噪。例如,字符 'A' 的值是 65峭梳,'a' 的值是 97,'0' 的值是48蹂喻,' ' 的值是 32 葱椭。

許多字符集都超出了 127,甚至多余 255(unsigned char 類型口四,二進(jìn)制序列為:1111 1111 )孵运。

C語(yǔ)言中,字符和整數(shù)的關(guān)聯(lián)是很強(qiáng)的蔓彩,字符常量事實(shí)上是 int 類型而非 char 類型治笨。

請(qǐng)看下面的例子,你會(huì)更深的理解 字符型與整型的關(guān)聯(lián)(字符集位ASCII)

char ch;
int i;

i = 'a';// i is now 97
ch = 65;//'ch' is now 'A'
ch = ch + 1;//'ch' now is 'B'

因此赤嚼,字符就有了數(shù)的一些特征旷赖。比如可以像數(shù)一樣比較,可以當(dāng)作條件應(yīng)用于 if語(yǔ)句更卒,for循環(huán)等孵。這是一個(gè)很便利的事情。

但是蹂空,以數(shù)的形式處理字符 可能降低程序的可移植性(不同機(jī)器使用的字符集不同) 和 導(dǎo)致編譯器無(wú)法檢查出來(lái)的多種編程錯(cuò)誤('a' + 'b' * 'c' 這類沒(méi)有意義的表達(dá)式等)俯萌。

有符號(hào)字符 和 無(wú)符號(hào)字符

有符號(hào)字符signed char:取值范圍:-128 ~ 127

無(wú)符號(hào)字符unsigned char: 取值范圍:0 ~ 255

可移植性技巧:不要假設(shè) char 類型默認(rèn)為 signed 或 unsigned 。如果有區(qū)別上枕,用 signed char 和 unsigned char 代替 char 咐熙。

算數(shù)類型

整數(shù)類型浮點(diǎn)類型 統(tǒng)稱為 算數(shù)類型。以下為 C89 中對(duì)算數(shù)類型的分類

  • 整數(shù)類型
    • 字符類型(char)
    • 有符號(hào)整型(signed char, short int, int, long)
    • 無(wú)符號(hào)整型(unsigned char, unsigned short int, unsigned int, unsigned long int)
    • 枚舉類型
  • 浮點(diǎn)類型(float辨萍,double棋恼,long double)

轉(zhuǎn)義序列

正如前面我們所看到的那樣,字符常量通常是用單引號(hào)擴(kuò)起來(lái)的單個(gè)字符。然而蘸泻,一些特殊符號(hào)(如換行符)是無(wú)法采用上述方法書(shū)寫(xiě)的琉苇,因此它們不可見(jiàn)(非打印字符),或者無(wú)法從鍵盤輸入悦施。因此并扇,為了使程序可以處理字符集中的每一個(gè)字符,C語(yǔ)言提供了一種特殊的表示法——轉(zhuǎn)義序列(escape sequence)抡诞。

轉(zhuǎn)義序列有兩種:字符轉(zhuǎn)義序列(character escape)和 數(shù)字轉(zhuǎn)義序列(numeric escape)穷蛹。

字符轉(zhuǎn)義序列(粗體比較常用,需要注意)

名稱 轉(zhuǎn)義序列 名稱 轉(zhuǎn)義序列
換行符 \n 回退符 \b
水平制表符 \t 垂直制表符 \v
單引號(hào) \' 換頁(yè)符 \f
雙引號(hào) \" 問(wèn)號(hào) ?
回車符 \r 報(bào)警(響鈴)符 \a
反斜杠 \\
數(shù)字轉(zhuǎn)義序列

為了將特殊字符寫(xiě)成數(shù)字轉(zhuǎn)義序列昼汗,首先要在 ASCII 碼表上查找字符的 八進(jìn)制或十六進(jìn)制值肴熏。比如某個(gè) ASCII 碼轉(zhuǎn)義字符(十進(jìn)制為 27)八進(jìn)制為 33 ,十六進(jìn)制為 1B顷窒。

1.八進(jìn)制轉(zhuǎn)義序列 由字符 \和跟隨其后的一個(gè)最多含有三位數(shù)字的八進(jìn)制數(shù)組成(此書(shū)必須表示為無(wú)符號(hào)字符蛙吏,最大值的八進(jìn)制為 377)。例如鞋吉,可以將轉(zhuǎn)義字符寫(xiě)成 \33\033鸦做。和八進(jìn)制常量不同,轉(zhuǎn)義序列的八進(jìn)制數(shù)不一定要用 0 開(kāi)頭
2.十六進(jìn)制轉(zhuǎn)義序列\x 和跟隨其后的一個(gè)十六進(jìn)制數(shù)組成谓着。(標(biāo)準(zhǔn)C對(duì)十六進(jìn)制數(shù)的位數(shù)沒(méi)有限制泼诱,但必須表示為無(wú)符號(hào)字符,所以最大值為 FF赊锚。)若采用這種方法治筒,可以把轉(zhuǎn)義字符寫(xiě)成 \x1b\x1B 的形式。字符 x必須小寫(xiě)舷蒲,但是十六進(jìn)制數(shù)字不限大小寫(xiě)耸袜。

作為字符常量使用時(shí)缠诅,轉(zhuǎn)義序列必須用一對(duì)單引號(hào)括起來(lái) 秒咐。例如伴逸,可以將轉(zhuǎn)義字符寫(xiě)為 \033\x1B 這種形式泛豪。轉(zhuǎn)移序列可能有些隱晦悬荣,所以采用 #define 的方式給他們命名是一種不錯(cuò)的主意:如果你不懂梭域,可以標(biāo)記下來(lái)治泥,然后跳過(guò)

#define ESC '\33' // ASCII escape character

轉(zhuǎn)移序列也可以嵌在字符串中使用芹血。

請(qǐng)打印出下面一行的內(nèi)容:

Gramps  sez,"a \ is a backslash."
printf("Gramps sez, \" a \\ is a backslash.\"\n");

數(shù)字轉(zhuǎn)義序列嵌入字符串藐窄,

printf("Hello!\007\n");// \007 打印警報(bào)
printf("\x48\x45\x4C\x4C\x4F\n");//HELLO

關(guān)于轉(zhuǎn)義序列

  • 上面的例子中资昧,為何沒(méi)有用單引號(hào)將轉(zhuǎn)義序列括起來(lái)?

    無(wú)論是普通字符還是轉(zhuǎn)義字符荆忍,只要是雙引號(hào)擴(kuò)起來(lái)的字符集合格带,就無(wú)需再用單引號(hào)括起來(lái)撤缴。雙引號(hào)中的字符集合叫做字符串(:arrow_forward:后面會(huì)講)

  • 何時(shí)使用 ASCII碼?何時(shí)使用轉(zhuǎn)義序列叽唱?

    如果要在轉(zhuǎn)義序列(比如屈呕,'\f')和 ASCII中('\014')之間選擇,請(qǐng)選擇前者('\f')棺亭。這樣的寫(xiě)法不僅好記虎眨,而且可移植性更高。'\f'在不使用 ASCII 碼的系統(tǒng)中镶摘,仍然有效嗽桩。

  • 如果要使用 ASCII 碼,為何要寫(xiě)成 '\032' 而不是 032?

    首先凄敢,'\032'能清晰的表達(dá)程序員使用字符編碼的意圖碌冶。其次,這樣的序列可以嵌入 C 的字符串中涝缝。比如上面的例題扑庞。

轉(zhuǎn)義序列示例
#include<stdio.h>

int main(void) {

    float salary;

    printf("\aEnter your desired monthly salary:");
    printf("$_____\b\b\b\b\b");//5 個(gè)退格符
    scanf("%f", &salary);
    printf("\t%.2f amonth is $%.2f a year", salary, 12 * salary);
    printf("\rGee!");//回到行首
    return 0;
}

嘗試思考一下這個(gè)程序會(huì)輸出什么。

用 scanf 和 printf 讀/寫(xiě)字符

轉(zhuǎn)換說(shuō)明 %c 允許 scanf 函數(shù)和 printf 函數(shù)對(duì)單個(gè)字符進(jìn)行 讀/寫(xiě) 操作:

char ch;
scanf("%c", &ch);
printf("%c", ch);

讀入字符前拒逮,scanf 函數(shù)不會(huì)跳過(guò)空白字符罐氨。我們不妨做以下測(cè)試:

程序如下,我們輸入“ a”(空格 + 字母 a)

#include<stdio.h>

int main(void) {

    char ch;

    scanf("%c", &ch);
    printf("%c", ch);

    return 0;
}

我們發(fā)現(xiàn) printf 函數(shù)沒(méi)有輸出任何東西消恍,其實(shí)是只打印了一個(gè)空格

現(xiàn)在岂昭,我們對(duì) scanf 函數(shù)做一點(diǎn)小改動(dòng):

scanf(" %c", &ch);//在轉(zhuǎn)換說(shuō)明 %c 前加一個(gè)空格

再次運(yùn)行程序以现,這時(shí)不管我們?cè)谧帜?a 前輸入多少空格狠怨,printf 函數(shù)都會(huì)打印出字母 a

scanf格式串中的空白表示“跳過(guò)零個(gè)或多個(gè)空白字符”

以下內(nèi)容不要求初學(xué)者理解

我們可以用 scanf 函數(shù)來(lái)檢測(cè)輸入行的結(jié)尾:檢查讀入的字符是否為換行符(如果是,則表示當(dāng)前行結(jié)尾)邑遏。例如佣赖,下面的循環(huán)將讀入并且忽略當(dāng)前輸入行剩下的所有字符:

do{
    scanf("%c", &ch);
}while(ch != '\n');

下次調(diào)用 scanf 函數(shù)時(shí),將讀入下一個(gè)輸入行中的第一個(gè)字符记盒。

用 getchar 和 putchar 讀/寫(xiě)字符

putchar 函數(shù)用于寫(xiě)單個(gè)字符:

putchar(ch);

每次調(diào)用 getchar函數(shù)時(shí)憎蛤,它都會(huì)讀入一個(gè)字符并將其返回。為了保存這個(gè)字符纪吮,必須使用賦值操作符將其存儲(chǔ)到變量中俩檬。

ch = getchar();// reads a character and stores it in ch

事實(shí)上,getchar 函數(shù)返回的是一個(gè) int 類型的值而不是 char 類型的值(原因在后面會(huì)講解)碾盟。因此棚辽,如果一個(gè)變量用于存儲(chǔ) getchar 函數(shù)讀取的字符,其類型設(shè)置為 int 而不是 char 也理所當(dāng)然冰肴。和 scanf 函數(shù)一樣 getchar 函數(shù)也不會(huì)跳過(guò)空白字符屈藐。

執(zhí)行程序時(shí)榔组,getchar 與 putchar 比 scanf 和 printf 更加高效。原因如下:

  1. 這兩個(gè)函數(shù)比 scanf函數(shù) 和 printf函數(shù) 簡(jiǎn)單的多联逻。 因?yàn)?scanf 和 printf 是設(shè)計(jì)用來(lái)按不同的格式讀/寫(xiě)多種不同類型的數(shù)的搓扯。
  2. 為了額外提升速度,通常 getchar函數(shù)和 putchar函數(shù)是作為宏(:arrow_forward:后面會(huì)講)來(lái)實(shí)現(xiàn)的包归。

以下內(nèi)容不要求初者理解

getchar 另一個(gè)優(yōu)勢(shì)是:返回的是讀入的字符锨推。

對(duì)于上面用 scanf 跳過(guò)當(dāng)前輸入行的程序,我們可以用 getchar 來(lái)改寫(xiě)

do{
    ch = getchar();
}while(ch != '\n');

我們可以讓程序更為精簡(jiǎn):

while((ch = getchar()) != '\n')
    ;

慣用法

while(getchar() != '\n')
    ;

getchar 還可以跳過(guò)不定數(shù)量空格字符:

慣用法

while(getchar() == ' ') //skips blanks
    ;

當(dāng)循環(huán)終止時(shí)箫踩,變量 ch 的值為 getchar 遇到的第一個(gè)非空白字符爱态。


注意

如果一個(gè)程序中混合使用 scanf 和 getchar ,請(qǐng)小心境钟。請(qǐng)看下面的程序锦担,這個(gè)程序會(huì)發(fā)生什么?

printf("Enter an integer: ");
scanf("%d", &i);
printf("Enter an command: ");
command = getchar();

輸入 i 后慨削,scanf 函數(shù)會(huì)留下沒(méi)有消耗掉的任意字符洞渔,包括(但不限于)換行符。getchar 函數(shù)隨后將取回第一個(gè)剩余的字符(這個(gè)程序中是換行符)缚态,這不是我們所希望的結(jié)果磁椒。


程序:確定消息的長(zhǎng)度

為了說(shuō)明字符的讀取方式,下面編寫(xiě)一個(gè)程序來(lái)計(jì)算消息的長(zhǎng)度玫芦。用戶輸入消息后浆熔,程序顯示長(zhǎng)度:

Enter a message: Hello World!

Your message was 12 character(s) long.

消息的長(zhǎng)度包含 空格和標(biāo)點(diǎn)符號(hào),但是不包含結(jié)尾的換行符桥帆。

length.c

#include<stdio.h>

int main() {

    int ch = 0;//定義變量時(shí)医增,如果這個(gè)變量沒(méi)有值初始化,可以將其初始化為 0 老虫。
    int count = 0;

    printf("Enter a message: ");//這里可以將你要輸入的信息一次性輸入完叶骨,getchar 會(huì)負(fù)責(zé)一個(gè)一個(gè)的去取
    ch = getchar();

    while (ch != '\n') {
        count++;//這個(gè)語(yǔ)句的意思就是 count = count + 1(將count加1后的值再賦值給count,實(shí)現(xiàn)count增加1)
        ch = getchar();
    }

    printf("Your message was %d character(s) long\n", count);

    return 0;
}

簡(jiǎn)化一下:

length2.c

#include<stdio.h>

int main() {

    int count = 0;

    printf("Enter a message: ");

    while (getchar() != '\n')
        count++;

    printf("Your message was %d character(s) long\n", count);

    return 0;
}

如果小黃有多條 message 想顯示長(zhǎng)度祈匙,如果每次測(cè)完都要重新運(yùn)行程序就太麻煩了忽刽。請(qǐng)你改寫(xiě)程序,滿足小黃這一要求夺欲。自己嘗試編寫(xiě)跪帝。

五 類型定義


類型定義(type definition)

#include<stdio.h>
typedef int int32;

int main(void) {
    int32 a;
    scanf("%d", &a);
    printf("%d", a);
    return 0;
}

編譯器會(huì)把 int32 類型看作 int 類型,因此 a 就是一個(gè)普通的 int 型變量些阅。

類型定義的優(yōu)點(diǎn)

類型定義使得程序更容易理解(選擇有意義的類型名)伞剑。例如,假設(shè) cash_in 和 cash_out 用于存儲(chǔ)美元數(shù)量扑眉。

typedef float Dollars 

隨后可以這樣定義 cash_in 和 cash_out:

Dollars cash_in,cash_out;

上面的寫(xiě)法比這樣寫(xiě)更有意義:

float cash_in,cash_out;

類型定義還可以使程序更容易修改 如果稍后覺(jué)得 Dollars 實(shí)際應(yīng)該該外 double 類型的纸泄,

typedef double Dollars 

如果沒(méi)有定義Dollars 赖钞,則需要找到所有用 float 定義美金數(shù)量的地方,這顯然不是一件容易的工作(對(duì)大型程序而言)聘裁。

類型定義的可移植性

類型定義時(shí)編寫(xiě)可移植性程序的重要工具雪营。程序從一臺(tái)計(jì)算機(jī)移動(dòng)到另一臺(tái)計(jì)算機(jī)可能引發(fā)的問(wèn)題就是不同計(jì)算機(jī)上的類型取值范圍可能不同。例如衡便,如果 int i = 100000 這在 32 位機(jī)器上是沒(méi)有問(wèn)題的献起,但是在 16位機(jī)器上就會(huì)出錯(cuò)。

這時(shí)镣陕,在 32 位機(jī)器上我們可以這樣定義:

typedef int Quantity;
Quantity a;

把程序轉(zhuǎn)到 16 位機(jī)器上:

typedef long Quantity;

當(dāng)然只這么做是不夠的谴餐,Quantity 定義的變化可能影響類型變量的使用方式。至少我們需要改變 printf 和 scanf 中的格式串(%d 改為 %ld)呆抑。

六 sizeof 運(yùn)算符

表達(dá)式(而非函數(shù))sizeof(類型)的值是一個(gè)無(wú)符號(hào)整型岂嗓,表示存儲(chǔ)屬于 類型名 的值所需要的字節(jié)數(shù)

在自己的計(jì)算機(jī)上敲一下下面的代碼,看看你的機(jī)器上每個(gè)數(shù)據(jù)類型 sizeof 求出來(lái)的值鹊碍,順便復(fù)習(xí)一下本節(jié)的數(shù)劇類型

#include<stdio.h>

int main(void) {
    printf("sizeof(signed char)        = %u byte \n", sizeof(signed char));
    printf("sizeof(unsigned char)      = %u byte \n", sizeof(unsigned char));
    printf("\n");
    printf("sizeof(short)              = %u byte \n", sizeof(short));
    printf("sizeof(unsigned short)     = %u byte \n", sizeof(unsigned short));
    printf("\n");
    printf("sizeof(int)                = %u byte \n", sizeof(int));
    printf("sizeof(unsigned int)       = %u byte \n", sizeof(unsigned int));
    printf("\n");
    printf("sizeof(long)               = %u byte \n", sizeof(long));
    printf("sizeof(unsigned long)      = %u byte \n", sizeof(unsigned long));
    printf("\n");
    printf("sizeof(long long)          = %u byte \n", sizeof(long long));
    printf("sizeof(unsigned long long) = %u byte \n", sizeof(unsigned long long));
    printf("\n");
    printf("sizeof(float)              = %u byte\n", sizeof(float));
    printf("sizeof(double)             = %u byte\n", sizeof(double));
    printf("sizeof(long double)        = %u byte\n", sizeof(long double));

    return 0;
}

為什么要用 %u 這個(gè)格式呢厌殉?

因?yàn)樵谖业臋C(jī)器上 sizeof 的值是 unsigned int 類型,每個(gè)機(jī)器可能不一樣侈咕。

但是C99 和 C11 標(biāo)準(zhǔn)為 sizeof 包括 strlen (:arrow_forward:) 的返回類型添加了 zd轉(zhuǎn)換說(shuō)明(z 表示 size_t類型)公罕。對(duì)于早期的C,sizeof 和 strlen 的返回類型通常是 unsignedunsigned long耀销。

通常情況下楼眷,sizeof運(yùn)算符也可以用于常量,變量熊尉,和表達(dá)式罐柳。

#include<stdio.h>

int main(void) {
    
    short a = 3;
    int b = 1, c = 2;

    printf("sizeof(1.)        = %u byte \n", sizeof(1.));
    printf("sizeof(1)         = %u byte \n", sizeof(1));
    printf("sizeof(a)         = %u byte \n", sizeof(a));
    printf("sizeof(a + b)     = %u byte \n", sizeof(a + b));
    printf("sizeof(b + c)     = %u byte \n", sizeof(b + c));


    return 0;
}
//輸出
sizeof(1.)        = 8 byte
sizeof(1)         = 4 byte
sizeof(a)         = 2 byte
sizeof(a + b)     = 4 byte
sizeof(b + c)     = 4 byte

sizeof(類型)不同的是, sizeof應(yīng)用于表達(dá)式時(shí)可以省略括號(hào)帽揪。例如硝清,可以用 sizeof i代替 sizeof(i) 辅斟;但是由于運(yùn)算符優(yōu)先級(jí)的問(wèn)題转晰,圓括號(hào)有時(shí)候還是需要的。編譯器會(huì)將 sizeof i + j解釋為 sizeof(i) + j士飒。這是因?yàn)?sizeof 作為一元運(yùn)算符 的優(yōu)先級(jí)高于 二元運(yùn)算符 + 查邢。為了避免出現(xiàn)這種問(wèn)題,建議還是保留圓括號(hào)酵幕。

參考資料:《C Primer Plus》《C語(yǔ)言程序設(shè)計(jì):現(xiàn)代方法》


本文GitHub已收錄扰藕,所有教學(xué)和練習(xí)代碼都會(huì)上傳上去。

https://github.com/hairrrrr/C-CrashCourse

如果對(duì)你有幫助芳撒,請(qǐng)點(diǎn)一個(gè) star:star: 呦~ ? 感謝邓深!:love_letter:

以上就是本次的內(nèi)容未桥。

如果文章有錯(cuò)誤歡迎指正和補(bǔ)充,感謝芥备!

最后冬耿,如果你還有什么問(wèn)題或者想知道到的,可以在評(píng)論區(qū)告訴我呦萌壳,我可以在后面的文章加上你們的真知灼見(jiàn):eye:亦镶。

關(guān)注我,看更多干貨袱瓮!

我是程序圓缤骨,我們下次再見(jiàn)。:fallen_leaf:


  1. 如果一個(gè)程序用于處理大量數(shù)據(jù)尺借,它就沒(méi)幾種選擇了 —— 《epigrams-on-programming》绊起。 ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市燎斩,隨后出現(xiàn)的幾起案子勒庄,更是在濱河造成了極大的恐慌,老刑警劉巖瘫里,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件实蔽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谨读,警方通過(guò)查閱死者的電腦和手機(jī)局装,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)劳殖,“玉大人铐尚,你說(shuō)我怎么就攤上這事《咭觯” “怎么了宣增?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)矛缨。 經(jīng)常有香客問(wèn)我爹脾,道長(zhǎng),這世上最難降的妖魔是什么箕昭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任灵妨,我火速辦了婚禮,結(jié)果婚禮上落竹,老公的妹妹穿的比我還像新娘泌霍。我一直安慰自己,他們只是感情好述召,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布朱转。 她就那樣靜靜地躺著蟹地,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藤为。 梳的紋絲不亂的頭發(fā)上锈津,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音凉蜂,去河邊找鬼琼梆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窿吩,可吹牛的內(nèi)容都是我干的茎杂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纫雁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼煌往!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起轧邪,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刽脖,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后忌愚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體曲管,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年硕糊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了院水。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡简十,死狀恐怖檬某,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情螟蝙,我是刑警寧澤恢恼,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站胰默,受9級(jí)特大地震影響场斑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜初坠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一和簸、第九天 我趴在偏房一處隱蔽的房頂上張望彭雾。 院中可真熱鬧碟刺,春花似錦、人聲如沸薯酝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至者填,卻和暖如春浩村,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背占哟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工心墅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榨乎。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓怎燥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蜜暑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铐姚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容