譚浩強C語言第3章數據類型_第1頁
譚浩強C語言第3章數據類型_第2頁
譚浩強C語言第3章數據類型_第3頁
譚浩強C語言第3章數據類型_第4頁
譚浩強C語言第3章數據類型_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1第三章 數據類型、運算符與表達式v各種進制之間的轉換l二進制、八進制、十六進制轉換成十進制u方法:按權相加10012345259212120212121111011)()(例10012894868381136)()(例1001231679781610162161516121)()(例af2v各種進制之間的轉換(整數)l二進制、八進制、十六進制轉換成十進制u方法:按權相加l十進制轉換成二進制、八進制、十六進制u原理:的余數是2)2.22(222.22).(00012110011112011naaaaaaaaaaaaannnnnnnnnnnu方法:連續(xù)除以基,從低到高記錄余數,直至商為0例 把十

2、進制數59轉換成二進制數5922921427232120(59)10=(111011)21101111 1 1 0 1 1余余余余余余例 把十進制數159轉換成八進制數1598198280(159)10=(237)82 3 7 余 7余 3余 2例 把十進制數459轉換成十六進制數4591628161160(459)10=(1cb)161 c b 余11余12余 13l二進制與八進制之間的轉換u二進制轉換成八進制:從右向左,每3位一組(不足3位左補0),轉換成八進制u八進制轉換成二進制:用3位二進制數代替每一位八進制數例 (1101001)2=(001,101,001)2=(151)8例 (2

3、46)8=(010,100,110)2=(10100110)2000 0001 1010 2011 3100 4101 5110 6111 74l二進制與十六進制之間的轉換u二進制轉換成十六進制:從右向左,每4位一組(不足4位左補0),轉換成十六進制u十六進制轉換成二進制:用4位二進制數代替每一位十六進制數例 (11010101111101)2=(0011,0101,0111,1101)2=(357d)16例 (4b9e)16=(0100,1011,1001,1110)2=(100101110011110)20000 00001 10010 20011 30100 40101 50110 60

4、111 71000 81001 91010 a1011 b1100 c1101 d1110 e1111 f5字節(jié)和位v內存以字節(jié)為單元組成v每個字節(jié)有一個地址v一個字節(jié)一般由8個二進制位組成v每個二進位的值是0或101234567012345678910.6數值的表示方法原碼、反碼和補碼v原碼:最高位為符號位,其余各位為數值本身的絕對值v反碼:l正數:反碼與原碼相同l負數:符號位為1,其余位對原碼取反v補碼:l正數:原碼、反碼、補碼相同l負數:最高位為1,其余位為原碼取反,再對整個數加13126912457810119-5=49+7=16=(4)127原碼反碼補碼+70000011100000

5、11100000111-7100001111111100011111001+0000000000000000000000000-0100000001111111100000000數的范圍0111111111111111(-127+127)0111111110000000(-127+127)0111111110000000(-128+127)(用一字節(jié)表示數)v負數補碼轉換成十進制數:最高位不動,其余位取反加1例 補碼:11111001 取反:10000110 加1: 10000111=-783.1 數據類型數據類型總表c數據類型基本類型構造類型指針類型空類型void定義類型typedef字符類

6、型char枚舉類型enum整 型實型單精度型float雙精度型double數組結構體struct共用體union短整型short長整型long整型int數據類型決定:1. 數據占內存字節(jié)數2. 數據取值范圍3. 其上可進行的操作9基本數據類型類型符號關鍵字數的表示范圍所占位數整型字符型實型有無(signed)int16-3276832767(signed)short16-3276832767(signed)long32-2147483648214748364716unsigned int0655353204294967295unsigned longunsigned short16065535

7、有float323.4e-383.4e38有double641.7e-3081.7e308有char8-128127無unsigned char80255說明:數據類型所占字節(jié)數隨機器硬件不同而不同,上表以ibm pc機為例:103.2 常量與變量標識符v定義:用來標識變量、常量、函數等的字符序列v組成:l只能由字母、數字、下劃線組成,且第一個字母必須是字母或下劃線l大小寫敏感l(wèi)不能使用關鍵字v長度:最長32個字符v命名原則:l見名知意l不宜混淆 如l與i, o與0例:判斷下列標識符號合法性sum sum m.d.john day date 3days student_name #33 lot

8、us_1_2_3 char ab _above $123m.d.john3days#33char$123ab11u一般用大寫字母u是宏定義預處理命令,不是c語句如 #define price 30常量v定義:程序運行時其值不能改變的量(即常數)v分類:l符號常量:用標識符代表常量u定義格式: #define 符號常量 常量例 符號常量舉例(ch2_1.c)#define price 30main() int num,total; num=10; total=num*price; printf(total=%d,total);運行結果:total=300 程序中用#define命令行定義pric

9、e代表常量30,此后凡在本文件中出現的price都代表30,可以和常量一樣進行運算如再用賦值語句給price賦值是錯的 price=40;/* 錯誤,不能給符號常量賦值3.2 常量與變量12變量變量變量代表內存中具有特定屬性的一個存儲單元,它變量代表內存中具有特定屬性的一個存儲單元,它用來存放數據,這就是變量的值。用來存放數據,這就是變量的值。變量名實際上是一個以一個名字對應代表一個地址,變量名實際上是一個以一個名字對應代表一個地址,在對程序編譯連接時由編譯系統(tǒng)給每一個變量名分在對程序編譯連接時由編譯系統(tǒng)給每一個變量名分配對應的內存地址。從變量中取值,實際上是通過配對應的內存地址。從變量中取值

10、,實際上是通過變量名找到相應的內存地址,從該存儲單元中讀取變量名找到相應的內存地址,從該存儲單元中讀取數據。數據。13編譯程序根據變量定義為其分配指定字節(jié)的內存單元.地址int a=1, b=-3,c;abc2字節(jié)2字節(jié)2字節(jié)地址地址.內存1-3隨機數變量v概念:其值可以改變的量v變量名與變量值v變量定義的一般格式: 數據類型 變量1,變量2,變量n;v變量初始化:定義時賦初值 例: int a,b,c; float data;決定分配字節(jié)數和數的表示范圍合法標識符例: int a=2,b,c=4; float data=3.67; char ch=a; int x=1,y=1,z=1; in

11、t x=y=z=1;v變量的使用:先定義,后使用例1 int student; stadent=19; /undefined symbol statent in function main 例2 float a,b,c; c=a%b; /illegal use of floating point in function main v變量定義位置:一般放在函數開頭main() int a,b=2; float data; a=1; data=(a+b)*1.2; printf(“data=%fn”,data);變量定義可執(zhí)行語句main() int a,b=2; a=1; float data;

12、 data=(a+b)*1.2; printf(“data=%fn”,data);143.2 常量與變量標識符v定義:用來標識變量、常量、函數等的字符序列v組成:l只能由字母、數字、下劃線組成,且第一個字母必須是字母或下劃線l大小寫敏感l(wèi)不能使用關鍵字v長度:最長32個字符v命名原則:l見名知意l不宜混淆 如l與i, o與0例:判斷下列標識符號合法性sum sum m.d.john day date 3days student_name #33 lotus_1_2_3 char ab _above $123m.d.john3days#33char$123ab建議變量名的長度最好不建議變量名的長

13、度最好不要超過要超過8 8個字符個字符. .15&整型常量(整常數)v三種形式:l十進制整數:由數字09和正負號表示.如 123,-456,0l八進制整數:由數字0開頭,后跟數字07表示.如0123,011l十六進制整數:由0 x開頭,后跟09,af,af表示. 如0 x123,0 xff例 12 與 12l例 30000 為int型 65536 為long int 型v整型常量的類型l根據其值所在范圍確定其數據類型l在整常量后加字母l或l,認為它是long int 型常量問題:0123 = ( )100 x123 = ( )100 xff = ( )1083291255問題:0123

14、 = ( )100 x123 = ( )100 xff = ( )10163.3.2 整型變量整型變量 (1)(1)整型數據在內存中的存放形式整型數據在內存中的存放形式 數據在內存中是以二進制形式存放的。數據在內存中是以二進制形式存放的。 如如: : int int i; / i; /* * 定義為整型變量定義為整型變量 * */ / i=10; / i=10; /* * 給給i i賦以整數賦以整數10 10 * */ / 十進制數十進制數1010的二進制形式為的二進制形式為10101010,turbo c 2.0turbo c 2.0和和turbo c+ 3.0turbo c+ 3.0為一個

15、整型變量在內存中分配為一個整型變量在內存中分配2 2個字節(jié)的存儲單元個字節(jié)的存儲單元( (不同的編譯系不同的編譯系統(tǒng)為整型數據分配的字節(jié)數是不相同的,統(tǒng)為整型數據分配的字節(jié)數是不相同的,vc+ 6.0vc+ 6.0則分配則分配4 4個字個字節(jié)節(jié)) )。 數值是以補碼數值是以補碼(complement) (complement) 表示的。表示的。 17(2)(2)整型變量的分類整型變量的分類共六種共六種有符號基本整型有符號短整型有符號長整型無符號基本整型無符號短整型無符號長整型(signed)int (signed)short (int )(signed) long (int)unsigned

16、intunsigned short (int)unsigned long (int) 注意:注意:括號表示其中的內容是可選的括號表示其中的內容是可選的. .18整數類型的有關數據:整數類型的有關數據: 類型類型 類型說明符類型說明符 長度長度 數的范圍數的范圍 基本型基本型 intint 2 2字節(jié)字節(jié) -32768-327683276732767 短整型短整型 short 2short 2字節(jié)字節(jié) -2-215152 21515-1 -1 長整型長整型 long 4long 4字節(jié)字節(jié) -2-231312 23131-1-1 無符號整型無符號整型 unsigned 2unsigned 2字節(jié)

17、字節(jié) 0 06553565535 無符號短整型無符號短整型 unsigned short 2unsigned short 2字節(jié)字節(jié) 0 06553565535 無符號長整型無符號長整型 unsigned long 4unsigned long 4字節(jié)字節(jié) 0 0(2 23232-1-1)19例如:整數例如:整數1313在內存中實際存放的情況:在內存中實際存放的情況:20例3.2 整型變量的定義與使用#include stdio.h#include void main()() int a,b,c,d; /*指定、為整指定、為整型變量型變量* unsigned ; *指定為無符號整型變指定為無符

18、號整型變量量* 12;-24;10; ; printf(,);,); 可以看到不同種類的整型數據可以進行算術運算可以看到不同種類的整型數據可以進行算術運算 運行結果:運行結果: , 21例3.3 整型數據的溢出#include #include void main()void main()int a,b; int a,b; a=32767; a=32767; b=a+1; b=a+1; printf(“%d,%dn”,a,b printf(“%d,%dn”,a,b);); 數值是以補碼表示的。一個整型變量只能容納-3276832767范圍內的數,無法表示大于32767或小于-32768的數。遇

19、此情況就發(fā)生“溢出”。運行結果:運行結果: 32767,-3276832767,-32768223.3.3 3.3.3 整型常量的類型整型常量的類型 (1)(1)一個整數,如果其值在一個整數,如果其值在-32768-32768+32767+32767范圍內,認為它是范圍內,認為它是intint型,它可以賦值給型,它可以賦值給intint型和型和long intlong int型變量。型變量。 (2) (2) 一個整數,如果其值超過了上述范圍,而在一個整數,如果其值超過了上述范圍,而在- -21474836372147483637+2147483647+2147483647范圍內,則認為它是為長

20、整型。范圍內,則認為它是為長整型。可以將它賦值給一個可以將它賦值給一個long intlong int型變量。型變量。 (3) (3) 如果所用的如果所用的c c版本(如版本(如turbo cturbo c)分配給)分配給short intshort int與與intint型數據在內存中占據的長度相同,則它的表數范圍與型數據在內存中占據的長度相同,則它的表數范圍與intint型型相同。因此一個相同。因此一個intint型的常量同時也是一個型的常量同時也是一個short intshort int型常量,型常量,可以賦給可以賦給intint型或型或short intshort int型變量。型變量

21、。 23(4) (4) 一個整常量后面加一個字母一個整常量后面加一個字母u u或或u u,認為是,認為是unsigned unsigned intint型,如型,如12345u12345u,在內存中按,在內存中按unsigned intunsigned int規(guī)定的規(guī)定的方式存放方式存放( (存儲單元中最高位不作為符號位,而用來存儲單元中最高位不作為符號位,而用來存儲數據存儲數據) )。如果寫成。如果寫成-12345u-12345u,則先將,則先將-12345-12345轉換轉換成其補碼成其補碼5319153191,然后按無符號數存儲。,然后按無符號數存儲。(5) (5) 在一個整常量后面加一

22、個字母在一個整常量后面加一個字母l l或或l l,則認為是,則認為是long long intint型常量。型常量。 例如:例如: 123l.432l.0l123l.432l.0l 用于函數調用中。用于函數調用中。如果函數的形參為如果函數的形參為long intlong int型,則要求實參也為型,則要求實參也為long intlong int型。型。24&實型常量(實數或浮點數)v表示形式:l十進制數形式:(必須有小數點) 如0.123, .123, 123.0, 0.0, 123.l指數形式:(e或e之前必須有數字;指數必須為整數)如12.3e3 ,123e2, 1.23e4 ,

23、e-5 , 1.2e-3.5 v實型常量的類型l默認double型l在實型常量后加字母f或f,認為它是float 型c c編譯系統(tǒng)將浮點型常量作為雙精度來編譯系統(tǒng)將浮點型常量作為雙精度來處理。處理。 例如例如:f = 2.45678 f = 2.45678 * * 4523.65 4523.65 系統(tǒng)先把系統(tǒng)先把2.456782.45678和和4523.654523.65作為雙作為雙精度數,然后進行相乘的運算,得到的精度數,然后進行相乘的運算,得到的乘也是一個雙精度數。最后取其前乘也是一個雙精度數。最后取其前7 7位位賦給浮點型變量賦給浮點型變量f f。如是在數的后面加。如是在數的后面加字母字

24、母f f或或f f(如(如1.65f, 654.87f1.65f, 654.87f),這樣),這樣編譯系統(tǒng)就會把它們按單精度(編譯系統(tǒng)就會把它們按單精度(3232位)位)處理處理. .25規(guī)范化的指數形式:規(guī)范化的指數形式: 在字母在字母e e(或(或e e)之前的小數部分中,小數點左邊)之前的小數部分中,小數點左邊應有一位(且只能有一位)非零的數字應有一位(且只能有一位)非零的數字. . 例如例如: : 123.456123.456可以表示為:可以表示為: 123.456e0, 12.3456e1, 1.23456e2, 123.456e0, 12.3456e1, 1.23456e2, 0.

25、123456e3, 0.0123456e4, 0.00123456e0.123456e3, 0.0123456e4, 0.00123456e 其中的其中的1.23456e31.23456e3稱為稱為“規(guī)范化的指數形式規(guī)范化的指數形式”。263.4.2 浮點型變量浮點型變量(1)(1)浮點型數據在內存中的存放形式浮點型數據在內存中的存放形式 一個浮點型數據一般在內存中占一個浮點型數據一般在內存中占4 4個字節(jié)個字節(jié)(32(32位位) )。與整。與整型數據的存儲方式不同,浮點型數據是按照指數形式存型數據的存儲方式不同,浮點型數據是按照指數形式存儲的。系統(tǒng)把一個浮點型數據分成小數部分和指數部分,儲的

26、。系統(tǒng)把一個浮點型數據分成小數部分和指數部分,分別存放。指數部分采用規(guī)范化的指數形式。分別存放。指數部分采用規(guī)范化的指數形式。27類型類型 位數位數 數的范圍數的范圍 有效數字有效數字float float 32 32 1010-37 -37 101038 38 6 67 7 位位doubledouble型型 64 64 1010-307-3071010308308 15 151616位位long double 128 10long double 128 10-4931-493110104932 4932 18181919位位 3.4 浮點型數據浮點型數據(2) (2) 浮點型變量的分類浮點型

27、變量的分類 浮點型變量分為單精度(浮點型變量分為單精度(floatfloat型)、雙精度(型)、雙精度(doubledouble型)和長雙精度型(型)和長雙精度型(long doublelong double)三類形式。)三類形式。例 float a;a=111111.111; /* a=111111.1*/double b;b=111111.111; /* b=111111.111*/28例3.4 浮點型數據的舍入誤差#include #include void main()void main()float a,b;float a,b; a = 123456.789e5; a = 12345

28、6.789e5; b = a + 20 ; b = a + 20 ; printf(“%fn”,b printf(“%fn”,b);); 一個浮點型變量只能保證的有效數字是7位有效數字,后面的數字是無意義的,并不準確地表示該數。應當避免將一個很大的數和一個很小的數直接相加或相減,否則就會“丟失”小的數運行結果:運行結果: 123456.789e5123456.789e529&字符常量v定義:用單引號括起來的單個普通字符或轉義字符. v字符常量的值:該字符的ascii碼值轉義字符及其含義:轉義字符含義nvradddtbf“xhh轉義字符含義換行垂直制表回車響鈴單引號3位8進制數代表的字符

29、水平制表退格換頁反斜線雙引號2位16進制數代表的字符如 101 -a 012 -n 376 - x61 -a 60 -0 483 -()例:a-101-x41-65如 a65, a97, 048 , n10如 a a ? n 101v轉義字符:反斜線后面跟一個字符或一個代碼值表示例 轉義字符舉例(ch2_001.c,ch2_004.c) main() printf(101 x42 cn); printf(i say:how are you?n); printf(c programn); printf(turbo c);運行結果:(屏幕顯示)a b cisay:”how are you?”c p

30、rogramturbo c例 main() printf(“yb=n”); 運行結果:屏幕顯示:=打印機輸出:30 3.5 3.5 字符型數據字符型數據 3.5.23.5.2字符變量字符變量字符型變量用來存放字符常量,注意只能字符型變量用來存放字符常量,注意只能放一個字符。放一個字符。字符變量的定義形式如下:字符變量的定義形式如下:char c1,c2;char c1,c2;可以用下面語句對可以用下面語句對c1,c2c1,c2賦值:賦值: c1c1aa;c2c2 b b ;一個字符變量在內存中占一個字節(jié)。一個字符變量在內存中占一個字節(jié)。 31 3.5 字符型數據字符型數據 3.5.3 字符數據

31、在內存中的存儲形式及其使用方法字符數據在內存中的存儲形式及其使用方法一個字符常量存放到一個字符變量中,實際上并不是把一個字符常量存放到一個字符變量中,實際上并不是把該字符的字型放到內存中去,而是將該字符的相應的該字符的字型放到內存中去,而是將該字符的相應的asciiascii代碼放到存儲單元中。這樣使字符型數據和整型數代碼放到存儲單元中。這樣使字符型數據和整型數據之間可以通用。據之間可以通用。注意注意: : 一個字符數據一個字符數據既可以以字既可以以字符形式輸出,符形式輸出,也可以以整也可以以整數形式輸出。數形式輸出。32例3.6 向字符變量賦以整數。 #include #include vo

32、id main()void main() char c1,c2; char c1,c2; c1=97; c1=97; c2=98; c2=98; printf(“%c %cn”,c1,c2); printf(“%c %cn”,c1,c2); printf(“%d printf(“%d %dn”,c1,c2); %dn”,c1,c2); 在第和第4行中,將整數97和98分別賦給c1和c2,它的作用相當于以下兩個賦值語句:c1;c2; 因為a和b的ascii碼為97和98 運行結果:運行結果: 97 9897 9833例3.7 大小寫字母的轉換 #include #include void mai

33、n()void main() char c1,c2 char c1,c2; c1=a;c1=a; c2=b; c2=b;c1=c1-32;c1=c1-32;c2=c2-32;c2=c2-32; printf printf(“(“c c cc,c1,c2c1,c2);); 程序的作用是將兩個小寫字母a和b轉換成大寫字母a和b。從代碼表中可以看到每一個小寫字母比它相應的大寫字母的ascii碼大32。語言允許字符數據與整數直接進行算術運算。 運行結果:運行結果: 34 有些系統(tǒng)(如turbo c)將字符變量定義為signed char型。其存儲單元中的最高位作為符號位,它的取值范圍是-128127。

34、如果在字符變量中存放一個ascii碼為0127間的字符,由于字節(jié)中最高位為0,因此用%d輸出字符變量時,輸出的是一個正整數。如果在字符變量中存放一個ascii碼為128255間的字符,由于在字節(jié)中最高位為1,用%d格式符輸出時,就會得到一個負整數。 35v字符常量與字符串常量不同&字符串常量v定義:用雙引號(“”)括起來的字符序列v存儲:每個字符串尾自動加一個 0 作為字符串結束標志h e l l o 0例 字符串“hello”在內存中a a 0例 a“a”例 空串 “”0例: char ch; ch=“a”; 例: char ch; ch=a; 結論結論:不能不能把一個字符把一個字符

35、串常量賦給串常量賦給一個字符變一個字符變量。量。36 3.6 變量賦初值 (1)(1)語言允許在定義變量的同時使變量初始化語言允許在定義變量的同時使變量初始化如如: : intint a=3; / a=3; / 指定為整型變量,初值為指定為整型變量,初值為 float f=3.56; / float f=3.56; / 指定為浮點型變量,初值為指定為浮點型變量,初值為 .56 .56 char c= a; / char c= a; / 指定為字符變量,初值為指定為字符變量,初值為a a 37 3.6 變量賦初值變量賦初值 (2)(2)可以使被定義的變量的一部分賦初值??梢允贡欢x的變量的一部分

36、賦初值。 如如: : intint a,b,c=5 a,b,c=5; 表示指定、為整型變量,但表示指定、為整型變量,但只對初始化,只對初始化,c c的初值為的初值為(3)(3)如果對幾個變量賦以同一個初值,如果對幾個變量賦以同一個初值, 應寫成:應寫成:intint a=3,b=3,c=3; a=3,b=3,c=3; 表示、的初值都是表示、的初值都是。 不能寫成不能寫成 int int a=b=c=3; a=b=c=3; 注意:注意:初始化不是在編譯階段完成的而是在程序運行時執(zhí)行初始化不是在編譯階段完成的而是在程序運行時執(zhí)行本函數時賦初值的,相當于有一個賦值語句。本函數時賦初值的,相當于有一個

37、賦值語句。 382.3不同類型數據間的轉換隱式轉換v什么情況下發(fā)生l運算轉換-不同類型數據混合運算時l賦值轉換-把一個值賦給與其類型不同的變量時l輸出轉換-輸出時轉換成指定的輸出格式l函數調用轉換-實參與形參類型不一致時轉換v運算轉換規(guī)則:不同類型數據運算時先自動轉換成同一類型39doublefloatlongunsignedintchar,short低高說明:必定的轉換運算對象類型不同時轉換例 char ch; int i; float f; double d;ch/i + f*d - (f+i)intintdoubledoubledoubledoubledoubledoubleintint

38、doubledoubledoubledoubledoubledouble10+a +i*f - d/l例 int i; float f; double d; long l;40顯式轉換(強制轉換)v一般形式:(類型名)(表達式)例 (int)(x+y) (int)x+y (double)(3/2) (int)3.6 v說明:強制轉換得到所需類型的中間變量,原變量類型不變 例 main() float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i); 結果:x=3.600000,i=3精度損失問題較高類型向較低類型轉換時可能發(fā)生412.4 運

39、算符和表達式c運運算算符符算術運算符:(算術運算符:(+ - + - * * / % + - / % + -)關系運算符:(關系運算符:( = != = !=)邏輯運算符:(!邏輯運算符:(! & |& |)位運算符位運算符 :(:( | & | &)賦值運算符:(賦值運算符:(= = 及其擴展)及其擴展)條件運算符:(條件運算符:(?:?:)逗號運算符:(逗號運算符:(, ,)指針運算符:(指針運算符:(* * & &)求字節(jié)數求字節(jié)數 :(:(sizeofsizeof)強制類型轉換:(類型)強制類型轉換:(類型)分量運算符:(分量運算符:(.

40、 -. -)下標運算符:(下標運算符:()其它其它 :(:(( ) -( ) -)42算術運算符和表達式v基本算術運算符: + - * / %l結合方向:從左向右l優(yōu)先級: - -* / % - + - (2) (3) (4)說明:l“-”可為單目運算符時,右結合性l兩整數相除,結果為整數l%要求兩側均為整型數據例 5/2 = -5/2.0 =例 5%2 = -5%2 = 1%10 = 5%1 = 5.5%2例 5/2 = 2 -5/2.0 = -2.5例 5%2 = 1 -5%2 = -1 1%10 = 1 5%1 = 0 5.5%2 ()43v自增、自減運算符+ -l作用:使變量值加1或減

41、1l種類:u前置 +i, -i (先執(zhí)行i+1或i-1,再使用i值)u后置 i+,i- (先使用i值,再執(zhí)行i+1或i-1)例 j=3; k=+j; j=3; k=j+; j=3; printf(“%d”,+j); j=3; printf(“%d”,j+); a=3;b=5;c=(+a)*b; a=3;b=5;c=(a+)*b; /k=4,j=4/k=3,j=4/4/3/c=20,a=4/c=15,a=444v自增、自減運算符+ -l作用:使變量值加1或減1l種類:u前置 +i, -i (先執(zhí)行i+1或i-1,再使用i值)u后置 i+,i- (先使用i值,再執(zhí)行i+1或i-1)l說明:u+ -

42、 不能用于常量和表達式,如5+,(a+b)+u+ -結合方向: 自右向左u優(yōu)先級:- + - -* / % -+ - (2) (3) (4)例 -i+ -(i+) i=3; printf(“%d”,-i+); /-3 例 j+k; (j+)+k;例 -i+ i=3; printf(“%d”,-i+); 45(5) (5) 有關表達式使用中的問題說明有關表達式使用中的問題說明 ansi c并沒有具體規(guī)定表達式中的子表達式的求值順序,允許各編譯系統(tǒng)自己安排。 例如:對表達式 a = f1( )+f2( ) 并不是所有的編譯系統(tǒng)都先調用f1( ), 然后調用f2( )。在有的情況下結果可能不同。有時

43、會出現一些令人容易搞混的問題,因此務必要小心謹慎。 46語言中有的運算符為一個字符,有的運算符由兩個字符組成 ,為避免誤解,最好采取大家都能理解的寫法。 例如:不要寫成i+j的形式,而應寫成 (i+)+j的形式.47在調用函數時,實參數的求值順序,標準并無統(tǒng)一規(guī)定。例如:例如:的初值為,如果有下面的函數調用: printf(,i+) 在有的系統(tǒng)中,從左至右求值,輸出“,”。在多數系統(tǒng)中對函數參數的求值順序是自右而左, 函數輸出的是“,”。以上這種寫法不宜提倡, 最好改寫成 j = i+;j = i+; printf(%d printf(%d, %d%d, j j,i)i)48賦值運算符和表達式

44、v簡單賦值運算符l符號: =l格式: 變量標識符=表達式l作用:將一個數據(常量或表達式)賦給一個變量v復合賦值運算符l種類:+= -= *= /= %= = = &= = |=l含義: exp1 op= exp2exp1 op= exp2 exp1 = exp1 op exp2exp1 = exp1 op exp2a+=3a=a+3x*=y+8x=x*(y+8)x%=3x=x%3例 a=3; d=func(); c=d+2;49v說明:l結合方向:自右向左l優(yōu)先級: 14l左側必須是變量,不能是常量或表達式l賦值表達式的值與變量值相等,且可嵌套l賦值轉換規(guī)則:使賦值號右邊表達式值自動

45、轉換成其左邊變量的類型例 3=x-2*y; a+b=3;例 float f; int i; i=10; f=i;則 f=10.0例 int i; i=2.56; /結果i=2;例: a=b=c=5 a=(b=5) a=5+(c=6) a=(b=4)+(c=6) a=(b=10)/(c=2)/表達式值為5,a,b,c值為5/ b=5;a=5/表達式值11,c=6,a=11/表達式值10,a=10,b=4,c=6/表達式值5,a=5,b=10,c=250v說明:l結合方向:自右向左l優(yōu)先級: 12l左側必須是變量,不能是常量或表達式l賦值表達式的值與變量值相等,且可嵌套l賦值轉換規(guī)則:使賦值號右邊

46、表達式值自動轉換成其左邊變量的類型例: a=12; a+=a-=a*a例: int a=2; a%=4-1; a+=a*=a-=a*=3; /a=-264 等價于a=a+(a=a-(a*a)/a=0 等價于a=a+(a=a*(a=a-(a=a*3)511.1.將整型數據賦給單、雙精度變量時,數值不變將整型數據賦給單、雙精度變量時,數值不變但以浮點數形式存儲到變量中但以浮點數形式存儲到變量中 如如: : 將將2323賦給賦給floatfloat變量,即執(zhí)行變量,即執(zhí)行2323,先,先將將2323轉換成轉換成23230000000000,再存儲在中。,再存儲在中。 將將2323賦給賦給double

47、double型變量,即執(zhí)行型變量,即執(zhí)行2323,系,系統(tǒng)將統(tǒng)將2323補足有效位數字為補足有效位數字為232300000000000000,00000000000000,然后以雙精度浮點數形式存儲到變量中。然后以雙精度浮點數形式存儲到變量中。522.2.將一個將一個doubledouble型數據賦給型數據賦給floatfloat變量時,截取其變量時,截取其前面前面7 7位有效數字,存放到位有效數字,存放到floatfloat變量的存儲單元(變量的存儲單元(4 4個字節(jié))中。但應注意數值范圍不能溢出。個字節(jié))中。但應注意數值范圍不能溢出。 如如: :float f;double d=123.4

48、56789e100; float f;double d=123.456789e100; f=d;f=d; 就出現溢出的錯誤。就出現溢出的錯誤。 如果將一個如果將一個floatfloat型數據賦給型數據賦給doubledouble變量時,數值變量時,數值不變,有效位數擴展到不變,有效位數擴展到1616位,在內存中以位,在內存中以8 8個字節(jié)個字節(jié)存儲存儲. .533.3.字符型數據賦給整型變量時,由于字符只占字符型數據賦給整型變量時,由于字符只占1 1個字節(jié),而整型變量為個字節(jié),因此將字個字節(jié),而整型變量為個字節(jié),因此將字符數據(個二進位)放到整型變量存儲單元符數據(個二進位)放到整型變量存儲單

49、元的低位中的低位中. .54第一種情況:第一種情況:低位對應、高位補零低位對應、高位補零 若所用系統(tǒng)將字符處理為無符若所用系統(tǒng)將字符處理為無符號字符類型,或程序已將字符變量號字符類型,或程序已將字符變量定義為定義為unsigned charunsigned char型,則將字型,則將字符的位放到整型變量低位,高符的位放到整型變量低位,高位補零。位補零。例如:例如:將字符將字符376賦給賦給int型變量型變量第二種情況:第二種情況:符號擴展符號擴展 若所用系統(tǒng)(如若所用系統(tǒng)(如turbo c+turbo c+)將字符處理為帶符號()將字符處理為帶符號(signed signed charchar

50、)時,若字符最高位為,則整型變量高位補;若字)時,若字符最高位為,則整型變量高位補;若字符最高位為,則高位全補。這稱為符最高位為,則高位全補。這稱為“符號擴展符號擴展”,這樣,這樣做的目的是使數值保持不變,如變量(字符做的目的是使數值保持不變,如變量(字符376376)以整)以整數形式輸出為,的值也是。數形式輸出為,的值也是。554.4.將一個將一個intint、shortshort、longlong型數據賦給一個型數據賦給一個charchar型變型變量時,只將其低量時,只將其低8 8位原封不動地送到位原封不動地送到charchar型變量(即型變量(即截斷)。截斷)。例如:例如:int i=2

51、89;char c=a;c=i;c的值為33,如果用“%c”輸出c,將得到字符“!” !的ascii碼為33。 賦值情況 :565. 將帶符號的整型數據(int型)賦給long型變量時,要進行符號擴展,將整型數的16位送到long型低16位中:如果int型數據為正值(符號位為),則long型變量的高16位補;如果int型變量為負值(符號位為),則long型變量的高16位補,以保持數值不改變。 反之,若將一個long型數據賦給一個int型變量,只將long型數據中低16位原封不動地送到整型變量(即截斷)。 57例如:例如:int a;long b;a=b 賦值情況如下賦值情況如下 :如果6553

52、6(八進制數0200000),則賦值后值為。586.6.將將unsigned intunsigned int型數據賦給型數據賦給long intlong int型變量時,不型變量時,不存在符號擴展問題,只需將高位補即可。存在符號擴展問題,只需將高位補即可。將一個將一個unsignedunsigned類型數據賦給一個占字節(jié)數相同的非類型數據賦給一個占字節(jié)數相同的非unsignedunsigned型整型變量(例如:型整型變量(例如:unsigned intunsigned int -int-int,unsigned long-longunsigned long-long,unsigned shor

53、tunsigned short-short-short),將),將unsignedunsigned型變量的內容原樣送到非型變量的內容原樣送到非unsignedunsigned型變量中,但如果數據范圍超過相應整型的型變量中,但如果數據范圍超過相應整型的范圍,則會出現數據錯誤。范圍,則會出現數據錯誤。59逗號運算符和表達式v形式:表達式1,表達式2,表達式nv結合性:從左向右v優(yōu)先級: 15v逗號表達式的值:等于表達式n的值v用途:常用于循環(huán)for語句中例 a=3*5,a*4 a=3*5,a*4,a+5例 x=(a=3,6*3) x=a=3,6*a例 a=1;b=2;c=3; printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c); /a=15,表達式值60/a=15,表達式值2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論