版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第二章基本數據類型、運算符與表達式
1本章要求:C語言的數據類型各種類型數據的定義方法常量與變量各種類型數據的混合運算強制類型變換重點:數據類型;數據的定義方法;各種類型數據的混合運算22.1C語言的數據類型C語言支持的數據類型非常豐富,它包括:基本數據類型,構造數據類型,指針類型,空類型四大類數據類型構造類型指針類型*空類型(無值類型)void枚舉類型enum數組類型[]結構體類型struct共用體類型union基本類型整型int字符型char實型(浮點型)單精度實型float雙精度實型double32.2常量、變量和標識符對于基本數據類型量,根據其取值是否可改變可分為常量和變量兩種。1.常量常量:其值不發(fā)生改變的量稱為常量。常量可與數據類型結合起來分類。例如,整型常量、實型常量、字符型常量、字符串常量和符號常量。在編程過程中,常量是可以不經說明而直接引用的,而變量則必須要先定義后使用。常用常量如下所示:整型常量:25、0、-7;實型常量:5.6、-6.9;字符常量:‘a’、‘b’。42.標識符標識符是用來標識變量名、符號常量名、函數名、數組名、類型名、文件名的有效字符序列。用一個標識符來表示一個常量,稱之為符號常量。符號常量在使用之前必須先定義,其一般形式為:#define標識符常量其中#define也是一條預處理命令(預處理命令都以"#"開頭),稱為宏定義命令其功能是把該標識符定義為其后的常量值。一經定義,以后在程序中所有出現(xiàn)該標識符的地方均代之以該常量值。一般習慣上符號常量的標識符用大寫字母,變量標識符用小寫字母,以示區(qū)別。5例2.1符號常量的使用。#defineLENGTH30#include<stdio.h>voidmain(){intarea,width;width=10;area=width*LENGTH;printf(“area=%d”,area);}程序運行結果:area=300程序分析:使用符號常量參與運算,符號常量與變量不同,它的值在其作用域內不能改變,也不能再被賦值。使用符號常量的好處是:含意清楚;能做到“一改全改”。63.變量變量,其值可以改變的量稱為變量。一個變量應該有一個名字,在內存中占據一定的存儲單元。變量在使用之前必須進行定義——即為每個變量取一個名稱(變量名),同時規(guī)定它的數據類型,以便編譯時根據數據類型分配存儲空間。C語言規(guī)定標識符只能由字母、數字和下劃線3種字符組成,且第一個字符必須是字母或者下劃線。下面標識符的寫法是合法的,可以作為變量名使用。Sum,Class_2,data,wang_ming,_high,a8,AREA,year_month_day下面是不合法的標識符和變量名:*data1,99sum,%yuan,$BGss,MR.tom,a1>b1,s/t注意,編譯系統(tǒng)區(qū)分大小寫,將它們認為是兩個不同的字符。所以,max和MAX是兩個不同的變量。7注意建議變量名的長度最好不要超過8個字符。在選擇變量名和其它標識符時應“見名知意”。要求對所有用到的變量作強制定義,也就是“先定義,后使用”。變量定義一般放在函數體的開頭部分。要區(qū)分變量名和變量值是兩個不同的概念。data變量名56變量值存儲單元變量名8變量名實際上就是以一個名字對應,代表一個地址。在對程序編譯連接時由編譯系統(tǒng)給每個變量名分配對應的內存地址。變量在定義時必須指定其數據類型,以便在編譯時為其分配存儲單元。 |&a2500H |—————— 2501H |----1250-----a=1250&b2502H |—————— 2503H |--------- 2504H |----123.67-----b=123.67 2505H |---------- 2506H |——————
變量名、變量值、變量地址間的關系例如:inta=1250;floatb=123.67;94.變量賦初值C語言中可有多種方法為變量提供初值??梢栽谧兞慷x的同時給變量賦以初值的方法。這種方法稱為初始化。在變量定義中賦初值的一般形式為:類型說明符變量1=值1,變量2=值2,……;例如:inta=68; /*指定a為整型變量,初值為68*/也可以使被定義的變量的一部分賦初值。例如floatb,c,d=7.9; 上式指定b,c,d為單精度實型變量,只對d初始化,其值為7.9。如果對幾個變量賦予相同的初值,應寫為:inte=50,f=50,g=50;10例2.2部分初始化數據程序運行結果:a=6,b=14,c=8程序分析:對定義的整型變量進行部分初始化,然后參與運算,并輸出結果。#include<stdio.h>voidmain(){inta=6,b,c=8;b=a+c;printf("a=%d,b=%d,c=%d\n",a,b,c);}115.變量的地址在定義了一個變量后,在內存中會分配相應的存儲單元,將變量的值存儲到該單元中。如前所述注意區(qū)分變量名和變量值這兩個不同的概念。例如:intx;floaty;x=3;y=3.14159;200020012002200320042005xy200633.14159…122.3簡單數據類型與表示范圍2.3.1整型數據1.整型常量的表示方法整型常量就是整常數。在C語言中,經常使用的整常數有三種進制,它們分別是八進制、十六進制和十進制。八進制前綴為“0”,十六進制前綴為“0x”,十進制無前綴。(1)十進制整數。
如:123,-456.4。(2)八進制整數。以0頭的數是八進制數。
如:0123表示八進制數123,等于十進制數83,-011表示八進制數-11,即十進制數-9。13(3)十六進制整數。以0x開頭的數是16進制數。
如:0x123,代表16進制數123,等于十進制數291。-0x12等于十進制數-18。
(4)整型常數的后綴:基本整型的長度為16位,十進制無符號整常數的范圍為0~65535,有符號數為-32768~+32767。八進制無符號數的表示范圍為0~0177777。十六進制無符號數的表示范圍為0X0~0XFFFF或0x0~0xffff。如果使用的數超過了上述范圍,就必須加上后綴“L”或“l(fā)”變?yōu)殚L整型數來表示。例如:567L(十進制為567)注意:長整數567L和基本整常數567在數值上并無區(qū)別,但是所占存儲空間大小不同。對567L而言,因為是長整型量,編譯系統(tǒng)將為它分配4個字節(jié)存儲空間。而對567,因是基本整型,則只分配2個字節(jié)的存儲空間。
142.整型變量(1)整型數據在內存中的存放形式數據在計算機內存中是以二進制形式存放的,例如,定義了一個整型變量a:inta; /*定義a為整型變量*/a=11; /*給a附以初值11*/由于在內存中數值是以補碼表示的,正整數的補碼和它的原碼在二進制形式上是相同的。所以,a=11,在內存中的存放形式如下所示。內存中圖a11000000000000101115負數的補碼:將該數的絕對值的二進制形式按位取反后再加1。例如:求-11的補碼:符號位(2)整型的分類基本型:類型說明符為int,在內存中占2個字節(jié)。短整量:類型說明符為shortint或short。所占字節(jié)和取值范圍均與基本型相同。長整型:類型說明符為longint或long,在內存中占4個字節(jié)。16有符號型:類型說明符為signed;無符號型:類型說明符為unsigned。有符號型與無符號型又可與前三種類型匹配而構成:類型名稱類型說明符數值范圍字節(jié)數有符號基本型[signed]int-32768~327672無符號基本型unsigned[int]0~655352有符號短整型[signed]short[int]-32768~327672無符號短整型unsignedshort[int]0~655352有符號長整型[signed]long[int]-2147483648~21474836474無符號長整型unsignedlong[int]0~42949672954上面帶[]的部分表示其內容可以省略17(3)整型變量的定義變量定義的格式為:類型說明符變量名標識符,變量名標識符,...;說明:允許在一個類型說明符后,定義多個相同類型的變量,并使用逗號分割變量名中多個變量,使用分號結束。類型說明符與變量名之間至少用一個空格間隔。變量定義必須放在變量使用之前。一般放在函數體的開頭部分。在程序的同一部分,禁止對同一變量進行重復定義,在書寫不同種類型變量定義時,避免都寫在一行上。對所用到的變量必須進行強制定義,即“先定義,后使用”。inta,b,c; /*a,b,c為整型變量*/longx,y; /*x,y為長整型變量*/18例2.3整型變量的定義與使用#include<stdio.h>voidmain(){longa,b;intx,sum,ave;/*定義整型變量x,sum,ave*/unsignedy; /*定義無符號整型變量y*/a=9;x=-10;y=20;b=x+a;sum=x+y;ave=(x+y)/2;/*不同類型數據間可進行運算*/printf("b=x+a=%ld,sum=%d,average=%d\n",b,sum,ave);}程序運行結果:b=x+a=-1,sum=12,average=6 19(4)整型數據的溢出每個整型數據都有其自身的數據類型,有其自身所占存儲空間大小,基本整型int定義的變量的最大允許存儲值為32767
例3.4整型數據的溢出#include<stdio.h>voidmain(){intx,y;x=32767;y=x+1;printf("%d,%d\n",x,y);}程序運行結果:32767,-32768程序分析:計算結果-32768與實際應該的結果32768相差一個符號,為什么呢?數據在內存中都是以該數的補碼的二進制形式存放的,32767的補碼為0111111111111111,加1后發(fā)生進位,變成1000000000000000,最高位的1占據了符號位,而它正好是-32768的補碼形式,所以才有上述輸出結果。202.3.2實型數據1.實型數據表示方法實型也稱為浮點型。C語言中,實數有二種形式:十進制小數形式和指數形式。十進制數形式:由數字0~9和小數點組成。注意,必須有小數點,且小數點的前面或后面必須有數字。例如:3.1415926,0.0、0.1、7.0、780.、-25.860等均為合法的實數。指數形式:由十進制數(基數)、加階碼標志“e”或“E”以及指數(階碼,只能為整數,可以帶符號)組成。其一般形式為:aEn(a為十進制數—基數,n為十進制整數—階碼)其值為a*10n。如:1.6E2(等于1.6*102)注意:階碼標志e(或E)之前必須有數字,且e后的指數必須為整數。212.實型數據在內存中的存放形式實型數據一般占4個字節(jié)(32位)內存空間。與整型數據的存儲方式不同,系統(tǒng)把一個實型數據分為小數部分和指數部分分別存放。指數部分采用規(guī)范化的指數形式表示。例如,實數7.15731在內存中的存放形式如下:圖中是用十進制形式來表示的,實際上計算機中是用二進制來表示小數部分,以及用2的冪次來表示指數部分的。1+.715731+數符小數部分指符指數+.715731×(+101)=0.715731223.實型變量的分類實型變量分為:單精度(float型)、雙精度(double型)和長雙精度(longdouble型)三類。類型說明符比特數(字節(jié)數)有效數字數的范圍float32(4)6~710-37~1038
double64(8)15~1610-307~10308
longdouble128(16)18~1910-4931~104932
實型變量定義,例如:floatx,y; /*x,y為單精度實型量*/doublea,b,c; /*a,b,c為雙精度實型量*/longdoublez; /*z為長雙精度實型量*/234.實型數據的舍入誤差由于實型變量的存儲單元能提供的有效數字總是有限的,其中單精度的有效數字是7為,雙精度的是16位。在有效位數之外的數字將被舍去,因此會產生誤差。例2.5實型數據的舍入誤差。#include<stdio.h>voidmain(){floatx,y;x=7654321.152e3;y=x+33;printf("%f,%f\n",x,y);}程序運行結果:7654321152.000000,7654321152.000000“%f”是輸出實數的制定格式。結果中x=y(tǒng),單精度的x較33大的多,其有效位數是7位,超過此范圍的數字是無意義的。TurboC規(guī)定小數后最多保留六位。應避免這種被“忽視”的情況發(fā)生。245.實型常數的類型實型常數不分單、雙精度,都按雙精度double型處理。例如定義一個實型變量a,進行如下運算:a=3.14159*7.1617編譯系統(tǒng)先將3.14159和7.1617作為雙精度數進行相乘的運算,得到的結果也是雙精度的,然后取其前7位有效數字賦值給實型變量a。這樣,可以使計算的結果更加精確。252.3.3字符型數據和字符串常量字符型數據包括字符常量和字符變量。1.字符常量字符常量是用一對單引號括起來的一個字符。例如:‘x’、‘d’、‘=’、‘!’等都是合法字符常量。注意:'d'和'D'是兩個不同的字符常量。注意:字符常量只能是單個字符,不能是字符串。字符可以是字符集中除了單引號本身“'”、雙引號“"”、反斜杠“\”外的任意字符。但數字被定義為字符型之后就不能參與數值運算。如'6'和6是不同的。'6’是字符常量,不能參與運算。例‘a’,‘A’,‘1’‘abc’、“a”262.轉義字符轉義字符以反斜線“\”開頭,后跟一個或幾個字符。轉義字符具有特定的含義,不同于字符的原意,故稱“轉義”字符。如,輸出函數中用到的“\n”其意義是“回車換行”C語言中,轉義字符有三種:簡單轉義字符、八進制轉義字符和十六進制轉義字符。\n換行
\t橫向跳格(水平制表8列)\r回車\\反斜杠\’單引號\”雙引號 \dddddd表示1到3位八進制數字\xhhhh表示1到2位十六進制數字27例2.6轉義字符的使用。程序運行結果:
f___g_c_de#include<stdio.h>voidmain(){printf(“__ab__c\tde\rf____\bg\n”);}程序分析:注意:轉義字符的作用。首先在左端輸出“__ab__c”,然后遇到“\t”,它的作用是跳到下一個制表符位置;一個制表符占8列,下一制表符位置從第9列開始,故在第9~10列上輸出“de”;然后遇到“\r”,它代表“回車”(不換行),于是返回到本行的行首(最左端第1列),輸出“f____”;然后遇到“\b”,它代表“退一格”,接著輸出“g”。程序運行時的輸出結果為:f_abg_c_de但顯示器上看到的結果與上述結果不同,為:f___g_c_de中間的字符被后續(xù)字符取代了。283.字符變量字符變量用來存儲字符常量,它只能存放一個字符。字符變量的類型說明符是char。字符變量類型定義的格式和書寫規(guī)則都與整型變量相同。例如:chara,b;4.在內存中的存儲形式每個字符變量被分配一個字節(jié)的內存空間,字符型數據在存儲時,并不是把該字符本身放到內存單元中,而是把該字符的ASCII碼值存放在變量的內存單元之中的。例如:A的十進制ASCII碼是65,a的十進制ASCII碼是9729在內存單元中存放的是65和97的二進制代碼:字符型數據在內存中是以ASCII碼存放的,它的存儲形式與整數的存儲形式類似。使得字符型數據和整型數據之間可以通用。C語言允許對整型變量賦以字符值,也允許對字符變量賦以整型值。在輸出時,允許把字符變量按整型量輸出,也允許把整型量按字符量輸出。30例2.7向字符變量與整型數據通用程序運行結果:a,A65,97#include<stdio.h>voidmain(){chara,b;a=65;b=97;printf("%c,%c\n",a,b);printf("%d,%d\n",a,b);}a,b值的輸出形式取決于printf函數格式串中的格式符,當格式符為"%c"時,對應輸出的變量值為字符,當格式符為"%d"時,對應輸出的變量值為整數。由此可知,字符型數據和整型數據是可以通用的,但要注意字符型數據只占一個字節(jié),它只能存放0-255范圍的整數。31例2.8大小寫字母的轉換程序運行結果:A,b65,98#include<stdio.h>voidmain(){chara,b;a='a';b='B';a=a-32;b=b+32;printf("%c,%c\n%d,%d\n",a,b,a,b);}a,b為字符變量并賦予字符值,C語言允許字符變量參與數值運算,即用字符的ASCII碼值參與運算。大小寫字母的ASCII碼值相差32,因此可以將小寫字母與大寫字母進行相互轉換,然后分別以字符型和整型輸出。325.字符串常量字符常量是用一對單引號括起來的一個字符,而字符串常量則是由一對雙引號括起的字符序列。例如:“chongqing”,“Cprogram”,“&1.75”,“a”等都是合法的字符串常量。字符串常量和字符常量是不同的量。它們之間的主要區(qū)別如下:外形不同,字符常量由一對單引號括起來,字符串常量由一對雙引號括起來。注意,'a'和"a"是不同的。內容不同,字符常量只能是單個字符,字符串常量則可以含一個或多個字符。單向賦值,可以把一個字符常量賦予一個字符變量,但不能把一個字符串常量賦予一個字符變量??臻g不同,字符常量占一個字節(jié)的內存空間,字符串常量占的內存字節(jié)數等于字符串中字節(jié)數加1。末尾增加的一個字節(jié)用于存放字符串結束的標志字符"\0"(ASCII碼為0)。33字符串"chongqing"的長度是9個字節(jié),在內存中所占的字節(jié)為10,其存儲方式如下圖所示:最后一個字符為'\0',在輸出時是不會輸出'\0'的。注意在書寫程序時不必加'\0','\0'是系統(tǒng)自動加上的。字符常量'a'和字符串常量"a"雖然都只有一個字符,但在內存中的情況是不同的。'a'在內存中占一個字節(jié),"a"在內存中占二個字節(jié)。342.3.4各數據類型間的混合運算整型(包括int,short,long)、浮點型(包括float,double)可以混合運算。在進行運算時,不同類型的數據要先轉換成同一類型,然后進行運算.轉換的原則就是為了兩個運算對象的計算結果盡可能提供多的存儲空間。當運算符兩端的運算對象的數據類型不一致時,在運算前先將類型等級較低的數據轉換成等級較高的數據——保值轉換。上述的類型轉換是由系統(tǒng)自動進行的.doublefloatlongunsignedintChar,short高低橫向向左的箭頭表示必定的轉換縱向的箭頭表示數據類型級別的高低,實際運算時不需逐級轉換,可由級別低的直接轉換為級別高的。35賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四舍五入向前舍入。例3.9數據類型轉換#include<stdio.h>voidmain(){floatPI=3.14159;ints,r=5;s=r*r*PI;printf("s=%d\n",s);}程序運行結果:s=78PI為實型;s,r為整型。在執(zhí)行s=r*r*PI語句時,r和PI都轉換成double型計算,結果也為double型。但由于s為整型,故賦值結果仍為整型,舍去了小數部分。362.3.5簡單數據類型的表示范圍
類型說明符字節(jié)數值范圍字符型char1C字符集基本整型int2-32768~32767短整型shortint2-32768~32767長整型longint4-214783648~214783647無符號型unsigned20~65535無符號長整型unsignedlong40~4294967295單精度實型float43/4E-38~3/4E+38雙精度實型double81/7E-308~1/7E+308372.3.6數據的簡單輸出將數據結果展示出來,必須使用輸出語句,所謂輸入輸出是以計算機為主體而言的。在C語言中,所有的數據輸入/輸出都是由庫函數完成的。在使用C語言庫函數時,要用預編譯命令#include將有關“頭文件”包括到源文件中。使用標準輸入輸出庫函數時要用到“stdio.h”文件,因此源文件開頭應有以下預編譯命令:#include<stdio.h>或#include"stdio.h“stdio是standardinput&outupt的英文縮寫,其意思是標準輸入輸出。38printf函數調用的一般形式為:printf("格式控制字符串",輸出表列)其中“格式控制字符串”用于指定輸出格式?!案袷娇刂谱址笨捎筛袷阶址头歉袷阶址畠煞N組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數據的類型、形式、長度、小數位數等。如:“%d”表示按十進制整型輸出;“%ld”表示按十進制長整型輸出;“%c”表示按字符型輸出等?!?f”表示按小數形式輸出單、雙精度實數非格式字符串在輸出時原樣照印,在顯示中起提示作用。輸出表列中給出了各個輸出項,要求格式字符串和各輸出項在數量和類型上應該一一對應。39例2.10數據輸出程序運行結果:688068,80D,Pa=68,b=80xis3.140000#include<stdio.h>voidmain(){inta=68,b=80;floatx=3.14;printf("%d%d\n",a,b);printf("%d,%d\n",a,b);printf("%c,%c\n",a,b);printf("a=%d,b=%d\n",a,b);printf("xis%f\n",x);}輸出第一句中,在兩%d之間加了一個空格(非格式字符),所以輸出的a,b值之間有一個空格。第二句中加入的是非格式字符逗號,因此輸出的a,b間加了一個逗號。第三句要求按字符型輸出a,b值。第四句中為了提示輸出結果又增加了非格式字符串。第五句的格式串要求按實型輸出,其他非格式字符按原型輸出。402.4C語言的運算符與表達式2.4.1C語言運算符簡介1.運算符C語言的運算符可分為算術運算符、賦值運算符、關系運算符、邏輯運算符、位運算符、條件運算符、逗號運算符及一些特殊的運算符。按運算符與運算對象(操作數)的關系可將C語言的運算符分為單目運算符、雙目運算符和三目運算符。單目運算符是指運算符只需要一個操作數,如!,++,--等;雙目運算符是指運算符需要兩個操作數,即運算符的左右兩側都需要一個操作數,如+,-,*,/,%等;三目運算符是指運算符需要三個操作數,如條件運算符?:。41C語言的運算符可分為以下幾類:算術運算符:用于各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運算,%)、自增(++)、自減(--)共七種。關系運算符:用于比較運算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六種。邏輯運算符:用于邏輯運算。包括與(&&)、或(||)、非(!)三種。位操作運算符:參與運算的量,按二進制位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)賦值運算符:用于賦值運算,分為簡單賦值(=)、復合算術賦值(+=,-=,*=,/=,%=)和復合位運算賦值(&=,|=,^=,>>=,<<=)條件運算符:這是一個三目運算符,用于條件求值(?:)。逗號運算符:用于把若干表達式組合成一個表達式(,)。指針運算符:用于取內容(*)和取地址(&)二種運算。求字節(jié)數運算符:用于計算數據類型所占的字節(jié)數(sizeof)。強制類型轉換運算符:強制進行數據類型轉換((類型))。分量運算符:用于存取結構和聯(lián)合中的成員(→,.),其優(yōu)先級在所有運算符中是最高的。下標運算符:用于數組下標的表示([]).其他運算符:如函數調用運算符(())。422.表達式表達式是使用運算符和圓括號將操作數連接起來構成的式子。C語言的操作數包括常量、變量、函數值等。例如:表達式(x-y)/(3*a+b)-6*d中包括+,-,/,*等運算符,操作數包括x,y,a,b,3等。C語言的運算符不僅具有不同的優(yōu)先級,而且還有一個特點,就是它的結合性。3.簡單語句C語言中,在表達式的末尾加上一個分號“;”就構成了簡單語句。在程序設計過程中要避免使用無意義的簡單語句。431.賦值運算符賦值就是將一個數據值存儲到一個變量中。注意,賦值的對象只能是變量,而這個數據值既可以是常量,也可以是變量,還可以是有確定值的表達式。賦值運算符記為“=”,其作用是將一個數據賦給一個變量。例如,“a=3;”其作用是執(zhí)行一次賦值操作,表示將常量3賦給變量a。2.賦值表達式由賦值運算符“=”將一個變量和表達式連接的式子稱為賦值表達式。其一般形式為:變量=表達式例如:x=sin(a)+(i++);2.4.2賦值運算符和賦值表達式44對賦值表達式求解的過程是:
①求賦值運算符右側的“表達式”的值;②賦給賦值運算符左側的變量。例如:賦值表達式“a=3*5”的值為15,執(zhí)行表達式后,變量a的值也是15。注意:一個表達式應該有一個值
45左值(lvalue):賦值運算符左側的標識符變量可以作為左值;而表達式就不能作為左值(如a+b);常變量也不能作為左值,右值(rvalue):出現(xiàn)在賦值運算符右側的表達式左值也可以出現(xiàn)在賦值運算符右側,因而左值都可以作為右值。
賦值表達式中的“表達式”,又可以是一個賦值表達式.例如:a=(b=5)分析:括弧內的“b=5”是一個賦值表達式,它的值等于5。執(zhí)行表達式“a=(b=5)”相當于執(zhí)行“b=5”和“a=b”兩個賦值表達式。賦值運算符按照“自右而左”的結合順序,因此,“(b=5)”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等價,最后a=5。46請分析下面的賦值表達式∶(a=3*5)=4*3分析:先執(zhí)行括弧內的運算,將15賦給a,然后執(zhí)行4*3的運算,得12,再把12賦給a。最后a的值為12,整個表達式的值為12。可以看到∶(a=3*5)出現(xiàn)在賦值運算符的左側,因此賦值表達式(a=3*5)是左值注意:在對賦值表達式(a=3*5)求解后,變量a得到值15,執(zhí)行(a=3*5)=4*3時,實際上是將4*3的積12賦給變量a,而不是賦給3*5。不能寫成:a=3*5=4*347將賦值表達式作為表達式的一種,使賦值操作不僅可以出現(xiàn)在賦值語句中,而且可以以表達式形式出現(xiàn)在其他語句(如輸出語句、循環(huán)語句等)中.如:printf("%d",a=b);
分析:如果b的值為3,則輸出a的值(也是表達式a=b的值)為3。在一個語句中完成了賦值和輸出雙重功能。483.類型轉換如果賦值運算符兩邊的數據類型不相同,系統(tǒng)將自動進行類型轉換,即把賦值號右邊的類型換成左邊的類型。具體規(guī)定如下:(1)整型數與實型數之間的轉換將實型數據(單、雙精度)賦予整型變量時,舍去實型數據的小數部分。例如:整型變量i,執(zhí)行“i=3.14”的結果是使得i的值為3,以整數形式存儲在內存中。將整型數據賦給實型(單、雙精度)變量時,數值不變,但以實型數據形式存儲在內存中,即增加小數部分(小數部分的值為0)。49(2)實型數據之間的轉換將一個double型數據賦給float型變量時,截取其前7位有效數字,存放到float型變量的存儲單元(32位)中。注意,數值范圍不能溢出。例如:floata;doubleb=123.456789e100;a=b;便會出現(xiàn)溢出錯誤。將一個float型數據賦給double型變量時,其數值不變,有效位數擴展到16位,在內存中以64位存儲。50(3)整型數與字符型數之間的轉換字符型數據賦給整型變量時,由于字符型只占一個字節(jié),而整型占二個字節(jié),故將字符的ASCII碼值放到整型量的低八位中,這時有兩種情況:如所用系統(tǒng)將字符型數據處理為無符號型的量或對unsignedint型變量賦值,則將字符型數據(8位二進制位)放到整型變量的低8位,高8位補為0。例如將字符'\376'(代表圖形字符“■”,其ASCII碼值為254)賦給int型變量a,如下圖所示。11111110‘\376’a000000001111111051如所用系統(tǒng)(如TurboC++3.0)將字符型數據處理為帶符號型的量(即signedchar),如字符最高位為0,則整型變量高8位補0;如字符最高位為1,則高8位全補1,見下圖所示。這稱為“符號擴展”,這樣做的目的是使數值保持不變,如上述字符'/376'以整數形式輸出為-2,a的值也是-2。11111110‘\376’a111111111111111011111110‘\376’a111111111111111011111110‘\376’a111111111111111052將一個int、short、long型數據賦給一個char型變量時,只將其低8位原封不動地送到char型變量(截斷)。例如:inta=291;charb='c';b=a;賦值情況見下圖所示,字符變量b的值為35,如用“%c”格式輸出b,將得到字符“?!保ㄆ銩SCII為35)。00100011i=2910000000100100011b=3553(4)整型數據之間的轉換如將帶符號的整型數據(int型)賦給long型變量時,要進行符號擴展,將整型數的16位送到long型低16位中。如int型數據為正值(符號位為0),則long型變量的高16位補0;如int型變量為負值(符號位為1),則long型變量的高16位補1,以保證數值不改變。如將一個long型數據賦給一個int型變量,只將long型數據中低16位原封不動地送到int型變量(截斷)。例如:intx;longy=9;x=y;賦值情況如下圖所示,54如果y=65536(八進制數0200000),則在賦值后x值為0,如下圖所示。000000000000000000000000000010010000000000001001y=9符號位a=9符號位000000000000000100000000000000000000000000000000b=65536符號位a=0符號位55(5)無符號整數與其他整數之間的轉換將一個unsignedint類型數據賦給一個與其長度相同的整型變量(如unsignedint→int,unsignedlong→long,unsignedshort→short)時,將unsigned型變量的內容原樣送到非unsigned型變量中,即進行原樣復制;但如果數據范圍超過相應整型的范圍,則會出現(xiàn)數據錯誤。例如:unsignedintx=65535;inty;y=x;將x整個送到y(tǒng)中,如下圖所示。由于y是int型,第1位是符號位,因此y成了負數。根據補碼指數可知,y的值為-1,可以用printf("%d",b)來驗證。56將非unsigned型數據賦值給長度相同的unsigned型變量,也是原樣賦值(連原有的符號也作為數值一起傳遞),yx符號位1111111111111111111111111111111157例2.11有符號數據送給無符號變量程序運行結果:65535程序分析:賦值情況如下圖所示#include<stdio.h>voidmain(){unsignedx;inty=-1;x=y;printf("%u\n",x);}yx符號位11111111111111111111111111111111不同類型的整型數據間的賦值歸根結底就是一條,按存儲單元中的存儲形式直接傳送。584.復合賦值運算符除了基本賦值運算符外,C語言還提供了另外十種復合運算符。它們就是在賦值符“=”之前加上其它二目運算符可構成復合賦值符。如+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。這些運算符把“運算”和“賦值”兩個操作結合在一起稱之為復合賦值運算符。采用復合賦值運算符可提高代碼執(zhí)行效率。構成復合賦值表達式的一般形式為:變量雙目運算符=表達式它等效于:變量=變量運算符表達式即將左邊的(變量)與右邊的(表達式)進行(雙目運算符)所規(guī)定的運算,然后將值返回給變量。例如x*=y+38 等價于x=x*(y+38)
59為便于記憶,可以這樣理解:
①x+=y(其中x為變量,y為表達式)②x+=y(將有下劃線的“x+”移到“=”右側)|___↑③x=x+y(在“=”左側補上變量名a)注意:如y是包含若干項的表達式,則相當于它有括號。對賦值表達式a+=a-=a*a,如果a的初值為3,則此賦值表達式求解步驟如下:先進行“a-=a*a”的運算,它相當于a=a-a*a,a的值為3-9=-6。再進行“a+=-6”的運算,相當于a=a+(-6),a的值為-6-6=-12。602.4.3強制類型轉換符強制類型轉換符就是“()”,它是單目運算符,它把表達式的類型強制類型轉換成圓括號中的“數據類型名”所指定的類型。強制類型轉換又稱為顯示轉換。其一般形式為:(類型說明符)(表達式)其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。例如:(int)a /*把a轉換為整型*/(float)(x+y) /*把x+y的結果轉換為實型*/61使用強制轉換時應注意以下問題:類型說明符和表達式都必須加括號,單個變量可以不加括號。例如,不要把(int)a,寫成int(a)。上式(float)(x+y)如寫成floatx+y則只是將x轉換成實型,再與y相加。無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變量的數據長度進行的臨時性轉換,而不改變數據說明時對該變量定義的類型。例如,(int)a,如a原指定為float型,則進行強制類型轉換后,得到一個int型的中間變量,它的值等于a的整數部分,而a的類型不變,仍為float型。62例2.12強制類型轉換程序運行結果:x=3,a=3.140000程序分析:本例表明,a雖強制轉為int型,但只在運算中起作用,是臨時的,而a本身的類型并不改變(仍為float型)。因此,(int)f的值為3(刪去了小數)而f的值仍為3.14。#include<stdio.h>voidmain(){floata=3.14;intx;x=(int)a;printf("(x=%d,a=%f\n",x,a);}632.4.4算術運算符和算術表達式
(1)基本的算術運算符:+(加法運算符,或正值運算符。如:3+5、+3)-(減法運算符,或負值運算符。如:5-2、-3)*(乘法運算符。如:3*5)/(除法運算符。如:5/3)%(模運算符,或稱求余運算符,%兩側均應為整型數據,如:7%4的值為3)64使用上述運算符時需要注意幾點:兩整數相除,結果為整數(舍去小數部分),商向下取整。如,20/7,的結果為2,3/4的結果為0。但是,如果除數或被除數中有一個為負數,則舍入的方向是不固定的。例如,-5/3,有的機器上得到結果-1,有的機器上得到結果-2。多數機器采取“向零取整”的方法,即-5/3=-1,取整后向零靠攏。如參與+,-,*,/運算的兩個數中有一個為實型,則結果為double型,因為實型都按dounle型進行處理。取摸運算符%實際上就是數學運算中的求余運算符,它要求參與運算的兩個操作對象均為整型。求余運算的結果等于兩數相除后的余數,結果的符號與%左邊的操作數的符號相同。例如,20%3的結果為2,45%-8的結果為5(其中“-”為負值運算符),-45%8的結果為-5。65例2.13除法及求余運算程序運行結果:2,-22.857143,-2.8571431程序分析:第一條輸出說明除法運算中兩操作數均為整數時其結果為整數,如操作數中出現(xiàn)負數,其結果向零取整。第二條輸出說明除法運算中兩操作數中有一個為實數,其結果為double型。第三條輸出說明取模運算是得到兩除數的余數,結果符號與%左邊的操作數的符號相同。#include<stdio.h>voidmain(){printf("%d,%d\n",20/7,-20/7);printf("%f,%f\n",20.0/7,-20.0/7);printf("%d\n",100%-3);}662.4.5自增自減運算符1.自增自減運算符在C語言中提供了兩個特殊的運算符:自增運算符“++”和自減運算符“――”。自增運算符“++”,其功能是使變量的值自增1。自減運算符“――”,其功能是使變量值自減1。它們均為單目運算,都具有右結合性,可以出現(xiàn)在運算符的前面或后面。有以下幾種形式: ++i i自增1后再參與其它運算。 ――i i自減1后再參與其它運算。 i++ i參與運算后,i的值再自增1。 i―― i參與運算后,i的值再自減1。注意區(qū)分“++”(或“――”)出現(xiàn)在運算變量的前面還是后面,這決定著變量使用前進行加(減)操作,還是使用后進行加(減)的操作。67如i的初值為3,則j=++i是先執(zhí)行i加1后,再把i的值4賦給j,最終i和j的值均為4;而k=i++是先把i的值3賦給k后,再執(zhí)行i加1,最終k的值為3,i的值為4。使用自增、自減運算符時,需注意以下幾點:自增運算符(++)和自減運算符(――),只能用于變量,而不能用于常量或表達式。例如,++26或(a-b)++是不合法的。自增、自減運算符是單目運算符,其優(yōu)先級高于基本的算術運算符,與單目運算符“-”(取負)的優(yōu)先級相同,其結合方向是“自右至左”。68例2.14自增自減運算程序運行結果:9889-8-9#include<stdio.h>voidmain(){inti=8;printf("%d\n",++i);printf("%d\n",--i);printf("%d\n",i++);printf("%d\n",i--);printf("%d\n",-i++);printf("%d\n",-i--);}程序分析:i的初值為8,輸出語句第1行i加1后輸出故為9;輸出語句第2行減1后輸出故為8;第3行輸出i為8之后再加1(為9);第4行輸出i為9之后再減1(為8);第5行輸出-8之后再加1(為9),第7行輸出-9之后再減1(為8)。注意,-i++和-i――之前的“-”為負值運算符,因此按照結合性這兩個表達式相當于-(i++)和-(i――)。692.表達式使用中的問題說明ANSIC并沒有具體規(guī)定表達式中的子表達式的求值順序,允許各編譯系統(tǒng)自己安排。例如:對表達式a=f1()+f2()并不是所有的編譯系統(tǒng)都先調用f1(),然后調用f2()。在有的情況下結果可能不同。有時會出現(xiàn)一些令人容易搞混的問題,因此務必要小心謹慎。調用先后順序不同,結果可能不同。C語言中有的運算符為一個字符,有的運算符由兩個字符組成,為避免誤解,最好采取大家都能理解的寫法。例如:不要寫成a+++b的形式,而應寫成(a++)+b的形式702.4.6位運算符、位運算表達式前面介紹的各種運算都是以字節(jié)作為最基本位進行的。C語言中,提供了位運算的功能,這使得C語言也能像匯編語言一樣用來編寫系統(tǒng)程序。C語言提供了6種位運算符,可分為兩類:位邏輯運算符和移位運算符。位邏輯運算符有4種,它們是:&按位與|按位或^按位異或~取反移位運算符有2種,它們是:<<左移>>右移711.字節(jié)和位在計算機中內存是以字節(jié)為單位的連續(xù)的存儲空間,每個內存單元(字節(jié)byte)有一個唯一的編號,即地址。一個字節(jié)一般由8個二進制位(bit)組成,其中最右邊的一位稱為“最低位”,最左邊的一位稱為“最高位”。每個二進制位的值是0或1。2.數值的編碼表示在計算機內表示數值的時候,以最高位為符號位,最高位為0表示數值為正,為1表示數值為負。表示數值的編碼一般由:原碼、反碼、補碼。(1)原碼用最高位為符號位來表示數值的符號:最高位為0表示正數,最高位為1表示為負數,其余各位代表數值本身的絕對值(二進制)。72如:+11的原碼是:00001011-11的原碼是:10001011注意,0的原碼有兩種不同的表示,+0的原碼是00000000,-0的原碼是10000000。由于0的表示方法不唯一,不適合計算機的運算,所以計算機內部一般不使用原碼來表示數據。(2)反碼正數的反碼與原碼相同,如+11的反碼也是00001011;而負數的反碼是:原碼除符號位外(仍為1),各位取反。例如:-11的反碼是:11110100+0的反碼是:00000000-0的反碼是:11111111同樣,0的表示方法不唯一,所以計算機內部一般也不用反碼來表示數據。73(3)補碼正數的補碼與原碼相同,如+11的補碼同樣是00001011,而負數的補碼是:除最高位仍為1外,原碼的其余各位求反,然后再加1。例如:-11的原碼是:10001011,求反(除最高位外)后,得11110100,再加1,結果是11110101。+0的補碼是:00000000-0的補碼是其反碼11111111加1,得100000000,最高位溢出,剩下00000000。所以,用補碼形式表示數值0時,是唯一的,都是00000000。目前計算機通常都是以補碼形式存放數據。因為采用編碼形式不僅數值表示唯一,而且能將符號位與其他位進行統(tǒng)一加以處理,為硬件實現(xiàn)提供方便。742.4.7逗號運算符和逗號表達式在C語言中,逗號“
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024石材進出口貿易代理合同6篇
- 2025山東省安全員《C證》考試題庫及答案
- 二零二五年度家用空調銷售安裝與節(jié)能環(huán)保認證合同3篇
- 2025版知識產權轉讓居間服務三方協(xié)議書
- 2024版合同范本格式
- 2025年幼兒園門衛(wèi)用工協(xié)議書及安全管理合同3篇
- 2025年度特色門面使用權轉讓合同(含經營品牌限制)3篇
- 光伏儲能測試解決方案
- 二零二五年度土地承包租賃合同(附土壤污染防治條款)3篇
- 2024砂石場地租賃合同:礦山綠色礦山改造3篇
- 《格林童話》課外閱讀試題及答案
- “銷售技巧課件-讓你掌握銷售技巧”
- 2019北師大版高中英語選修一UNIT 2 單詞短語句子復習默寫單
- 房地產項目保密協(xié)議
- 2023年云南省初中學業(yè)水平考試 物理
- 【安吉物流股份有限公司倉儲管理現(xiàn)狀及問題和優(yōu)化研究15000字(論文)】
- 火災自動報警系統(tǒng)施工及驗收調試報告
- 《13464電腦動畫》自考復習必備題庫(含答案)
- 中國成人血脂異常防治指南課件
- 2023塔式太陽能熱發(fā)電廠集熱系統(tǒng)設計規(guī)范
- 消費稅改革對商貿企業(yè)的影響與對策
評論
0/150
提交評論