C語言學(xué)習(xí)之一——數(shù)據(jù)類型,運(yùn)算符和表達(dá)式

1.C語言數(shù)據(jù)類型


image.png

1.1 基本類型:其值不可以再分解為其他類型
1.1.1 整型:整型常量,整型變量。
整型常量:有3種形式:十進(jìn)制(沒有前綴,數(shù)碼為0~9),八進(jìn)制(以0為前綴,數(shù)碼取值為0 ~ 7),十六進(jìn)制(以0X或0x為前綴,數(shù)碼取值為0 ~ 9和A - F(a ~ f))。注:整型常量可添加后綴,主要根據(jù)其類型來添加。
整型變量:變量是CPU為程序開辟的一塊內(nèi)存地址空間的代號,因此其實(shí)質(zhì)存儲形式是二進(jìn)制(即數(shù)值是以01代碼形式存儲在這塊內(nèi)存空間中的,是以補(bǔ)碼形式表示的)。一個字節(jié)Byte = 8bit即8位。補(bǔ)碼:正數(shù)的補(bǔ)碼即為其原碼;負(fù)數(shù)的補(bǔ)碼為其原碼按位取反,再加1。(所以注意內(nèi)存溢出的情況)

/#include <stdio.h>
void main()
{
int a, b, c;
a = 32767;
b = a + 1;
printf("%d, %d\n", a, b)
}
//輸出 32767(0111111111111111), -32768(1000000000000000)
//這里內(nèi)存溢出了,因?yàn)樵傺a(bǔ)碼中,最左邊第一位表示的是符號位(0表示“+”, 1表 示“-”),當(dāng)a=32767時(shí)即為在16位下所能表示的最大數(shù)值,如果再+ 1,則引發(fā)內(nèi)存溢 出,造成0111111111111111 + 1 == 1000000000000000,即為-32768(因?yàn)樵趦?nèi)存中數(shù)值的表示方式為補(bǔ)碼,正數(shù)的補(bǔ)碼即為本身,所以011111111111111 == 32767; 而 1000000000000000表示的是負(fù)數(shù),其的反碼為 1111111111111111 == (1)111111111111111,所以后15位再+1,即為1000000000000000 == 32768,再算上第一位符號位,即為-32768)

整型的分類:1)基本型:類型說明符為int,占2字節(jié);
2)短整型:類型說明符為short int 或 short,占2字節(jié)
3)長整型:類型說明符為long int 或 long, 占4字節(jié)
4)無符號整形:類型說明符為unsigned

1.1.2 字符型:字符常量,字符變量,字符串常量。
字符常量定義:用單引號括起來的一個字符(不可以是字符串)。例如:’a’, ‘+’, ‘?’, ‘=’ 都是合法字符常量。
字符常量具有以下特點(diǎn):1)字符常量只能用單引號括起來,不能用雙引號或其他括號;2)字符常量只能是單個字符,不能是字符串;3)字符可以是字符集中的任意字符,但是數(shù)字被定義為字符常量后就不能參與數(shù)值運(yùn)算。例,’5’和5是不同的,’5’是字符常量,不可以參與數(shù)值運(yùn)算,但是5仍舊可以。
轉(zhuǎn)義字符:轉(zhuǎn)義字符是一種特殊的字符常量。以反斜杠”\”開頭,后面跟一個或幾個字符。轉(zhuǎn)義字符具有特殊的意義, 不同于字符原本的意義。例如,”\n”表示回車。(注:這里是使用的雙引號,所以它又有別于字符串常量。)目的:用來表示一般字符不便于表示的控制代碼。


image.png

字符變量定義:字符變量用來存儲字符常量,即單個字符。字符變量的類型說明符是char,在函數(shù)中定義字符變量即:char a, b;
字符型數(shù)據(jù)在內(nèi)存中的存儲形式及使用方法:每個字符型變量被分配一個字節(jié)的內(nèi)存空間,因此只能存儲一個字符型常量,且該字符型常量是以ASCII碼的形式存放在該變量的存儲空間中的。例,char a = ’A’; 則a所指代的內(nèi)存空間中存儲的是’A’的ASCII碼65的二進(jìn)制形式01000001。

/#include <stdio.h>
void main()
{
Char a, b;
a = 65;
b = 66;
printf(“%c, %c\n”, a, b)
printf(“%d, %d\n”, a, b)
}
//輸出:A, B
65, 66
//在該例中,a與b是字符型變量,當(dāng)賦值時(shí)賦予整型數(shù)據(jù)a = 65,b = 66,因此輸出時(shí)取決于printf函數(shù)中要求輸出的格式,如要求輸出”%c”即字符型時(shí),即按照65, 66的ASCII碼輸出相對應(yīng)的字符型常量’A’, ‘B’;如果要求輸出”%d”即整型時(shí),即按照原先的賦值輸出65,66(注:這里的65,66是整型)。

字符串常量定義:是有一對雙引號括起來的字符序列(其長度可以為多個字符也可以是一個字符)。
字符常量與字符串常量的區(qū)別:1)字符常量用單引號,字符串常量用雙引號;2)字符常量只能是單個字符,字符串常量可以包含一個或多個字符;3)字符常量只占1個字節(jié),而字符串常量占自身字節(jié)長度+1,增加的一個字節(jié)是為了存放轉(zhuǎn)義字符”\O”(字符串結(jié)束的標(biāo)志);4)可以把一個字符常量賦值給字符變量,但是不能把一個字符串常量賦值給字符變量(因?yàn)椋址兞績H有1字節(jié)的內(nèi)存空間,而字符串常量往往至少占2個字節(jié),因此會造成內(nèi)存溢出)。


image.png

1.1.3 浮點(diǎn)型:浮點(diǎn)型常量,浮點(diǎn)型變量。(注:在浮點(diǎn)數(shù)計(jì)算中需要注意舍入誤差,因此在不同精度數(shù)字計(jì)算時(shí)需要先將低精度轉(zhuǎn)化為高精度(計(jì)算機(jī)內(nèi)部執(zhí)行),再進(jìn)行計(jì)算)。
浮點(diǎn)型常量只采用十進(jìn)制。有兩種形式:十進(jìn)制小數(shù)形式:由數(shù)碼0~9和小數(shù)點(diǎn)組成;指數(shù)形式:由十進(jìn)制數(shù),加階碼標(biāo)志“E”或“e”及階碼(階碼必須為十進(jìn)制整數(shù))組成(合法指數(shù)形式為3.11E5 == 3.11 * 10^5 == 311000)。注:浮點(diǎn)型常量可添加后綴,主要根據(jù)其類型來添加。
浮點(diǎn)型變量:


image.png

浮點(diǎn)型變量分類:1)單精度(float)一般編譯器中占4個字節(jié)(32位)內(nèi)存空間(注:根據(jù)不同編譯器,所占內(nèi)存字節(jié)數(shù)可能會有變化),數(shù)值范圍為3.4E-38 ~ 3.4E38,只能提供7位有效數(shù)字;2)雙精度(double)占8個字節(jié)(64位)內(nèi)存空間,其數(shù)值范圍為(1.7E-308 ~ 1.7E308)提供16為有效數(shù)字;3)長雙精度(long double)

1.2 指針類型:指針是一種特殊的,同時(shí)又是具有重要作用的數(shù)據(jù)類型。 其值用來表示某個變量在內(nèi)存儲器中的地址。雖然指針變量的取值類似于整型量,但是這兩個類型是完全不同的量。
1.3 構(gòu)造類型:構(gòu)造類型是根據(jù)已經(jīng)定義的一個或多個數(shù)據(jù)類型用構(gòu)造的方法來定義的。就是說, 一個構(gòu)造類型的值可以分解為若干個“成員” 或 “元素”。而每個“成員”都是一個基本類型或者又是一個構(gòu)造類型。
1.4 空類型:在調(diào)用函數(shù)值時(shí), 通常應(yīng)向調(diào)用者返回一個函數(shù)值。這個返回的函數(shù)值時(shí)具有一定的數(shù)據(jù)類型的,應(yīng)在函數(shù)定義及函數(shù)說明中給以說明。但是也有一類函數(shù),調(diào)用后并不需要向調(diào)用者返回函數(shù)值, 這種函數(shù)可以定義為“空類型”。其類型說明符為void。
1.5 常量與變量:
常量定義:在程序執(zhí)行過程中,其值不發(fā)生改變的量成為常量。
符號常量:用標(biāo)識符代表一個常量。在使用前必須先定義:#define 標(biāo)識符 常量

/#define PRICE 30
void main()
{
int num, total;
num = 10;
total = num * PRICE;
printf("total = %d", total);
}

這里的#define 時(shí)一條預(yù)處理命令,稱為宏定義命令,其功能時(shí)把該標(biāo)識符定義為其后的常量值。一經(jīng)定義,以后在程序中所有出現(xiàn)該標(biāo)識符的地方均以該常量值代替(#define后面的常量值一改則全改)。注:習(xí)慣上符號常量的標(biāo)識符用大寫字母,變量標(biāo)識符用小寫字母。

變量定義:其值可以改變的量成為變量。


image.png

這里的“k” 即為變量。注:變量定義必須放在變量使用之前,且一般放在函數(shù)體的開頭部分。

1.6 各類數(shù)值型數(shù)據(jù)之間的混合運(yùn)算:
在不同數(shù)值類型數(shù)據(jù)進(jìn)行混合運(yùn)算時(shí),需要先把它們的數(shù)值類型轉(zhuǎn)換為同一類型,才能進(jìn)行下一步運(yùn)算。有兩種轉(zhuǎn)換方式:(1)自動轉(zhuǎn)換;(2)強(qiáng)制轉(zhuǎn)換
(1)自動轉(zhuǎn)換:1)若參與運(yùn)算的數(shù)據(jù)的類型不同,先轉(zhuǎn)換為同一類型,再運(yùn)算(在自動轉(zhuǎn)換的情況下,如(1)char a = 'A'; int b =2; printf("%c", a + b); 輸出:C。 (2)char a = 'A'; int b =2; printf("%d", a + b); 輸出:67。 (3)float a = 2.33; int b =2; printf("%f", a + b); (a,b轉(zhuǎn)換為double類型再相加)輸出:4.330000。 (4)float a = 2.33; int b =2; printf("%d", a + b);(編譯時(shí)會warning,輸出錯誤數(shù)字,因?yàn)樵诰幾g時(shí)計(jì)算機(jī)將a,b自動轉(zhuǎn)換為double類型,然后相加,當(dāng)要求輸出int類型時(shí)需要強(qiáng)制轉(zhuǎn)換,否則出錯。 (5)long a = 23; int b =2; printf("%d", a + b);(編譯時(shí)會warning,輸出正確數(shù)字25, 因?yàn)樵诰幾g時(shí)計(jì)算機(jī)將a,b自動轉(zhuǎn)換為long int類型,然后相加得到long int類型的25,因此輸出int類型仍為25) );2)按照數(shù)據(jù)長度增加的方向進(jìn)行轉(zhuǎn)換,以保證精度不降低。例,int和long數(shù)據(jù)相加時(shí),先把int數(shù)據(jù)轉(zhuǎn)換成long再進(jìn)行運(yùn)算;3)所有的浮點(diǎn)運(yùn)算都是以雙精度進(jìn)行的,即使所有的元素都是float類型,也都要先轉(zhuǎn)換成double再進(jìn)行運(yùn)算(保證數(shù)值的最低舍入誤差)。4)char和short參與運(yùn)算時(shí)必須先轉(zhuǎn)換為int(注:char型根據(jù)其ASCII碼進(jìn)行轉(zhuǎn)換,如果char a = ‘5’,要以5進(jìn)行運(yùn)算的話需可以進(jìn)行自動轉(zhuǎn)換(因?yàn)樽址?’對應(yīng)的ASCII碼表中的數(shù)值也是5)也可以進(jìn)行強(qiáng)制轉(zhuǎn)換(直接 a =int(a),得出數(shù)字5));5)在賦值運(yùn)算中,賦值號兩邊的數(shù)據(jù)類型不同時(shí),賦值號右邊的值的類型轉(zhuǎn)換為賦值號右邊的變量的類型。當(dāng)賦值號右邊的數(shù)據(jù)類型的長度長于左邊時(shí),將會按照四舍五入的方式來降低部分精度(即丟失部分?jǐn)?shù)據(jù))。(例:char a = 65; 這里的a是char型,而65是int型,因此要將65轉(zhuǎn)換為其所對應(yīng)的ASCII碼01000001,再轉(zhuǎn)換成對應(yīng)的字符型'A'然后賦給a)。

image.png

//例
/#include <stdio.h>
void main()
{
float PI = 3.14159;
int s, r = 5;
s = r * r * PI;
Printf(“s = %d\n”, s)
}
\輸出:s = 79
\計(jì)算時(shí),首先PI和r都轉(zhuǎn)換為double,然后相乘,得到的double型數(shù)值四舍五入成int型賦給s。

(2)強(qiáng)制轉(zhuǎn)換:轉(zhuǎn)換形式:(類型說明符)(表達(dá)式)。 其功能是把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成類型說明符所表示的類型。
例,(float) a 將a強(qiáng)制轉(zhuǎn)換成float類型
(int) (x + y) 將x, y強(qiáng)制轉(zhuǎn)換成int(注,這里的x和y都要用括號括起來,因?yàn)閤,y都要強(qiáng)制轉(zhuǎn)換)
使用強(qiáng)制轉(zhuǎn)換的注意事項(xiàng):
1)類型說明符和表達(dá)式都得加括號(表達(dá)式為單個變量可以不加),例如把(int) (x+y)寫成(int) (x) + y則變成先把x強(qiáng)制轉(zhuǎn)換成int再與y相加。
2)無論是強(qiáng)制轉(zhuǎn)換還是自動轉(zhuǎn)換,都是臨時(shí)性的,都不會改變數(shù)據(jù)說明時(shí)對該變量定義的類型(例,int a = 3, b =5; float c; c = (float) (a + b); 然而a和b仍舊是int類型)。

1.7 算術(shù)運(yùn)算符和算術(shù)表達(dá)式
算數(shù)運(yùn)算符:算數(shù)運(yùn)算符分1)單目運(yùn)算符;2)雙目運(yùn)算符;3)三目運(yùn)算符
運(yùn)算符優(yōu)先級:


image.png

運(yùn)算符結(jié)合性:1)左結(jié)合性(自左向右)(如”-”,”+”);2)右結(jié)合性(自右向左)(如賦值運(yùn)算符”=”, x = y = z,即x = (y = z))。


image.png

賦值運(yùn)算的類型轉(zhuǎn)換注意事項(xiàng):當(dāng)賦值運(yùn)算符左右兩邊類型不同時(shí),系統(tǒng)自動進(jìn)行類型轉(zhuǎn)換,將右邊的類型轉(zhuǎn)換為左邊的類型:1)浮點(diǎn)型賦予整型,舍去小數(shù)部分; 2)整型賦予浮點(diǎn)型,數(shù)值不變,但以浮點(diǎn)型式存放(小數(shù)部分的值為0);3)字符型賦予整型,因?yàn)樽址蜑?個字節(jié),而整型為2個字節(jié),因此將字符的ASCII碼值放在整型變量的低八位,高八位全為0。整型賦給字符型,只把低八位賦給字符變量(因此一個字符變量存放的int值范圍為-128~256,這里需要注意的是最左邊第一位為符號位,當(dāng)輸入負(fù)值時(shí),其它位求反再加1得補(bǔ)碼(其實(shí)經(jīng)過實(shí)際測試,當(dāng)輸入為正數(shù)時(shí),但是輸入值超過127時(shí),printf("%d", a)輸出的是一個負(fù)值,因?yàn)?27 == 01111111,而128 == 100000000(編譯器自動認(rèn)為是負(fù)數(shù)),即(1)0000000求反(1)1111111,再+1得(1)10000000 == - 128))。
再賦值運(yùn)算符”=”之前加上其他二目運(yùn)算符可以構(gòu)成復(fù)合運(yùn)算符,如 +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, !=等。

逗號運(yùn)算符 “,”, 功能是把兩個表達(dá)式連接起來組成一個表達(dá)式。
一般形式是:表達(dá)式1, 表達(dá)式2;
其求值過程是,分別求出2個表達(dá)式的值,然后以表達(dá)式2的值作為整個逗號表達(dá)式的值(擴(kuò)展到表達(dá)式n,則表達(dá)式n的值即為整個逗號表達(dá)式的值)。

//例
/#include <stdio.h>
void main()
{
int a = 2, b = 3, c = 4, x, y;
y = (x = a + b), b + c;
printf(“y = %d, x = %d”, y, x);
}
//輸出:y = 7, x = 5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • ?1 C語言程序的結(jié)構(gòu)認(rèn)識 用一個簡單的c程序例子,介紹c語言的基本構(gòu)成、格式、以及良好的書寫風(fēng)格,使讀者對c語...
    CONLYOUC閱讀 8,735評論 9 66
  • 1、標(biāo)識符 什么事標(biāo)識符呢?變量的名字就是標(biāo)識符。不僅限于變量名,程序中各種元素的名字,都屬于標(biāo)識符。例如符號常量...
    滕王閣序閱讀 973評論 0 0
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,473評論 3 44
  • 曾經(jīng)看到一篇名為「請有失戀的人告訴我」的文章,那個標(biāo)題吸引了我的目光,也讓我思考了關(guān)于失戀的意義。我有很多想法,也...
    咖啡上癮的MsJ閱讀 413評論 2 5
  • 1.空置率沒有標(biāo)準(zhǔn)的計(jì)算 2.任何價(jià)格管制都不能成功 3.使用需求是投資需求的基礎(chǔ) 投資就是因?yàn)檫@個東西將來人們有...
    Mark86閱讀 353評論 0 0