




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章
數據類型及其運算第3章
數據類型及其運算C程序結構基本數據類型、變量與常量賦值運算符與賦值表達式算術運算符與算術表達式逗號運算與逗號表達式
運算符的優先級與結合性混合運算時數據類型的轉換主要內容C程序結構主要內容C程序結構例3-1從鍵盤輸入半徑,求圓的周長和面積。算法思路:radius:存放從鍵盤輸入的半徑;
計算周長:perimeter=2*PI*radius;
計算面積:area=PI*radius*radius;輸出perimeter和area的值不確定性列公式C程序結構例3-1從鍵盤輸入半徑,求圓的周長和面積。算法思#include<stdio.h>doublePI=3.14;intmain(){ intradius; doubleperimeter,area; printf("Inputaradius:"); scanf("%d",&radius); perimeter=2*PI*radius; area=PI*radius*radius; printf("Theperimeteris%.2f,Theareais %.2f\n",perimeter,area); return0;}聲明變量radius提示輸入輸入數據賦給radius計算周長和面積輸出結果預處理命令全局變量聲明函數定義#include<stdio.h>聲明變量radius提示組成C源程序的三個要素(1)
預處理命令。C編譯程序對源程序編譯前,先由預處理器對預處理命令進行預處理。(2)全局聲明。包括全局變量聲明和函數原型聲明。(3)函數定義。一個C語言程序必須有一個main函數。函數由一組語句組成。比語句更小的語法單位:表達式、變量、常量和關鍵字等。組成C源程序的三個要素(1)預處理命令。C編譯程序對源程序#include<stdio.h>/*函數功能:計算兩個整數相加之和入口參數:整型數據a和b
返回值:整型數a和b之和*/intAdd(inta,intb){ return(a+b);}intmain(){ intx,y,sum=0; printf("Inputtwointegers:"); scanf("%d%d",&x,&y); /*輸入兩個整型數x和y*/ sum=Add(x,y); /*調用函數Add計算x和y相加之和*/ printf("sum=%d\n",sum); /*輸出x和y相加之和*/ return0;}#include<stdio.h>關鍵字(Keyword)又稱為保留字,C語言預定的具有固定含義的一些單詞例如:數據類型修飾符int,控制語句return等
autobreakcasecharcontinueconstdefaultdoubledo
elsefloatforifintlongNULLreturnswitchshort
signed
truethisunsignedvoidwhileC程序常見符號—關鍵字關鍵字(Keyword)autobreakcasC程序常見符號大小寫的英文字母:A~Z,a~z數字字符:0~9特殊字符:
空格 ! % ^ & _(下劃線) + * = - ~<
> / \ ' " ; . , ()
[] {}C程序常見符號大小寫的英文字母:A~Z,a~zC程序常見符號—標識符標識符(Identifier)分系統預定義標識符和用戶自定義標識符以字母和下劃線開始,大小寫敏感,最長32個字符。以大寫字母、小寫字母、下劃線或數字0~9組成。直觀,見名知意,便于記憶和閱讀最好使用英文單詞或其組合,忌使用漢語拼音不宜混淆如1與l,o與0不允許使用關鍵字作為標識符的名字int,float,for,while,if等C程序常見符號—標識符標識符(Identifier)例:判斷下列標識符號合法性,并標出不合法的標示符。sum Sum M.D.John dayDate 3days student_name#33 lotus_1_2_3 chara>b _above $123M.D.John3days#33char$123a>bC程序常見符號—標識符例:判斷下列標識符號合法性,并標出不合法的標示符。M.D.J運算符(Operator)34種,詳見附錄分隔符(Separator)空格、回車/換行、逗號等其它符號大花括號"{"和"}"
"/*"和"*/"、//是程序注釋所需的定界符數據(Data)變量(Variable)常量(Constant)C程序常見的其他符號運算符(Operator)C程序常見的其他符號數據類型、常量和變量數據為什么要區分類型?不同類型的數據代表不同的數據表示形式合法的取值范圍占用內存空間大小可參與的運算種類
數據類型、常量和變量數據為什么要區分類型?數據類型基本類型構造類型指針類型空類型整型實型(浮點型)字符型枚舉類型數組類型結構體類型共用體類型單精度實型雙精度實型基本整型長整型短整型無符號整型數據類型(DataType)數據類型基本類型構造類型指針類型空類型整型實型(浮點型)字符衡量數據類型所占空間大小的單位常用的單位如下:b,B,KB,MB,GB,TB
bit,中文叫法:位Byte,中文叫法:字節Kilobyte(KB),中文叫法:KMegabyte(MB),中文叫法:兆Gigabyte(GB),中文叫法:GTerabyte(TB),中文叫法:T1TB==
1,024GB1GB==
1,024MB1MB==
1,024KB1KB
==
1,024B1B==
8b衡量數據類型所占空間大小的單位常用的單位如下:1TB==如何衡量數據類型所占空間大???一個位有多大?只能是"0"或者"1",這叫二進制一個字節有多大?保存一個字符(英文字母、數字、符號)ASCII(美國標準信息交換碼)編碼見附錄A,常用字符與ASCII碼對照表兩個字節保存一個漢字GB編碼可以表示0~255之間的整數如何衡量數據類型所占空間大???一個位有多大?基本數據類型表3-1C的基本數據類型(32位機)基本數據類型表3-1C的基本數據類型(32位機)整型(integer)整型:有符號整數,允許取值為整數。如:123,567整型的分類:整型(int):占4個字節短整型(shortint):占2個字節,通常簡寫為short長整型(longint):占4個字節,通常簡寫為long數據類型修飾符整型(integer)整型:有符號整數,允許取值為整數。如:signed用來修飾char、int、short和long,說明他們是有符號的整數(正整數、0和負整數)。有符號數在計算機內以二進制補碼形式存儲的,最高位表示符號位(0為正數,1為負數)。一般缺省都是有符號的,所以這個修飾符通常省略。shortint型:最大:32767最小:-32768數據類型修飾符signedshortint型:最大:32767最小:-3unsigned用來修飾char、int、short和long,說明他們是無符號的整數(正整數和0)。無符號型在機內只能存放正數,最高位也來表示數值的。當數據占用同樣內存位數時,無符號型數值范圍比有符號數擴大一倍。數據類型修飾符unsigned
short
int型:最大:65535最小:0unsigned數據類型修飾符unsignedshort擴充的整型類型有符號基本整型[signed]int;無符號基本整型
unsignedint;有符號短整型[signed]short[int];無符號短整型
unsignedshort[int];有符號長整型[signed]long[int];無符號長整型unsignedlong[int];擴充的整型類型有符號基本整型[signed]int二進制存放與溢出(1)10=
(0000000000000001)2(-1)10=
(111111111111
1111)2(65535)10=
(11111111
11111111)2當65535按unsignedshortint型理解時,仍為65535;而當按shortint型理解時,被當作-1的補碼。二進制存放與溢出(1)10=(00000000000字符型(char)字符型char的取值為單個字符。例如:
'A'、'
'用ASCII編碼表示一個字符,每個字符占用1個字節,總共可以表示256個不同的字符。char類型前可用signed和unsigned加以修飾。例如: signedcharch=-128;unsignedcharch=255;思考:unsignedchar范圍?字符型(char)字符型char的取值為單個字符。例如:'浮點型(floatpoint)浮點類型:允許取值為帶小數的實數(如
123.46)雙精度浮點型double單精度浮點型float
double比float的精度更高(即小數的有效位數更多),表示數據的范圍也更大。浮點型(floatpoint)浮點類型:允許取值為帶小數的常量常量(Constant)在程序執行過程中其值不變的量。常量包括以下幾種:整型常量浮點常量字符常量字符串常量常量常量(Constant)在程序執行過程中其值不變的量。整型常量(short,int,long)整型常量18、-31longint型常量123l、123L、123456l、123456Lunsignedint型常量123u、123U整型常量的類型根據其值所在范圍確定其數據類型在整型常量后加字母l或L,認為它是longint型常量例:12與12L整型常量(short,int,long)整型常量例:12與1整型常量的表示形式十進制形式:[±]若干個0~9的數字
如:100,-50,0
八進制形式:
[±]以0開頭的若干個0~7數字
如:0123
表示十進制數83
-011
表示十進制數-9。十六進制形式
:[±]用0x或0X開頭的若干個0~9,a~f,A~F的數字
如:
0X2F
表示十進制的數字47
0x123
表示十進制數291
-0x12
表示十進制數-18。整型常量的表示形式十進制形式:[±]若干個0~9的數字整型常量的表示形式例:0524為int型,在內存中是如何表示的?0101010000000001425例:01736L為longint型1101111000000011000000000000000063710000000000000000整型常量的表示形式例:0524為int型,在內存中是如何何謂類型溢出(Overflow)?C語言提供的任何類型都有取值范圍。當向其賦超過此范圍的數值,就會產生數值溢出,得到一個不正確的結果。例如:shortint的范圍是-32768~32767如果超出取值范圍,給它一個小于-32768或者大于32767的數會如何呢?小蛇能吞下大象嗎?何謂類型溢出(Overflow)?C語言提供的任何類型都有取注意事項Example:看程序分析運行結果#include<stdio.h>intmain(){ shortinta; printf("Input:"); scanf("%d",&a); printf("a=%d\n",a); return0;}
運行結果:
Input:12345
a=12345Input:1234567
a=-10617
整型≠整數short
int的范圍:-32768~+32767Because:
12345的補碼是0011000000111001
1234567的補碼是100101101011010000111
截去多余部份(超過2個字節的左邊部分)后
其原碼為
1010100101111001(-10617)注意事項Example:看程序分析運行結果運行結果:整型≠有趣的結果可用下圖表示:
327673276632765……-32766-32767-32768輸入(Input:)輸出(a=)327673276732768-3276832769-3276732770-32766-32768-32768-3276932767-3277032766有趣的結果可用下圖表示:輸入(Input:)輸出(a=)類型溢出的解決方案?解決方案:預先估算運算結果的可能范圍,采用取值范圍更大的類型。1+2+3+…1!+2!+3!+…13+23+33+…如果不需要處理負數,則采用無符號類型。在運算還沒開始之前就判斷運算數是否在合理的取值范圍內。如果超出,則停止運算,轉錯誤處理。類型溢出的解決方案?解決方案:浮點型常量
(float,double)浮點型常量:可以含有小數部分的數值常量。根據占用內存長度的不同,分為:單精度浮點常量:占用32位內存,用F、f表示。
如:19.4F,3.0513E3f,8701.52f雙精度浮點常量:占用64位內存,用帶D或d或不加后綴(缺省)的數值表示
如:2.433E-5D,700041.273d,3.1415。longdouble型常量123.45l、456.78L、4.5e3L
因為字母l和數字1容易混淆,所以常使用大寫L做后綴。浮點型常量(float,double)浮點型常量:可以含有浮點型常量的兩種表示形式十進制小數形式:包括符號"+"與"-",數字0~9以及小數點"."。如:0.123,1.23,123.0指數形式:包括符號"+"與"-",數字0~9,小數點"."以及e(或E)。如:0.123e3表示0.123×103
-35.4E-5表示-35.4×10-5其中e或E之前必須有數字,且e或E后面的指數必須為整數。如:e-5,
1.2E-3.5不正確浮點型常量的兩種表示形式十進制小數形式:包括符號"+"與"-浮點型常量
(float,double)
由于計算機系統分配給一個數據的存儲空間是有限的。一般來說,一個實型常量無法轉換成與之等值的有限位的二進制數據,其有限位以后的數字將被舍去,由此就會產生舍入誤差。浮點型常量(float,double)由于例://下列程序的功能是將10個實型數0.1進行累加,然后將累加結果輸出。#include<stdio.h>intmain(){ intk; /*定義整型變量k*/ doublex,z; /*定義雙精度整型變量x與z*/ z=1.0; /*實數1.0賦給變量z*/ x=0.0; for(k=0;k<10;k++) x=x+0.1; /*10個0.1累加到變量x中*/ printf("z=%20.17f\n",z); /*輸出變量z的值*/ printf("x=%20.17f\n",x); /*輸出變量x的值*/ return0;}運行這個程序后,輸出的結果如下:
z=1.00000000000000000x=0.99999999999999989例://下列程序的功能是將10個實型數0.1進行累加,然后字符常量
(Character)用一對單引號括起的單個字符,其值為該字符的ASCII碼值。如:'A'—65,'\n'—10。注意:
'1'和整數1的區別字符'1'代表一個形狀為'1'的符號,在需要時按原樣輸出,在內存中以ASCII碼形式存儲,占1個字節整數1是以整數存儲方式,占1個字節0011000100000001字符常量(Character)用一對單引號括起的單個字符,字符常量-轉義字符用"\"開頭的字符(例如,"\n",代表1個字符)表3-2常用轉義字符字符常量-轉義字符用"\"開頭的字符(例如,"\n",代表1如:'\101'-----'A' '\012'-----'\n'
'\376'-----'
'
'\x61'-----'a'
'\60'-----'0'
'\483'-----例:'A'-----'\101'-----'\x41'-----65字符常量
(Character)(
)如:'\101'-----'A' '\012'-----轉義字符舉例例1:閱讀程序,給出運行結果intmain(){ printf("\101\x42C\n"); printf("\\CProgram\\\n"); printf("Turbo\'C\'"); return0;}運行結果:(屏幕顯示)ABC\CProgram\Turbo'C'轉義字符舉例例1:閱讀程序,給出運行結果運行結果:(屏幕顯示轉義字符舉例例2:閱讀程序,給出運行結果intmain(){ printf("Y\b=\n"); return0;}運行結果:屏幕顯示:=打印機輸出:¥轉義字符舉例例2:閱讀程序,給出運行結果運行結果:例3:閱讀程序,給出運行結果#include<stdio.h>intmain(){
//'\t',跳到下一個輸出區
printf("Howareyou?\t"); printf("Iamfine.\n\n"); printf("Howareyou?\n");
//退格符'\b',使當前輸出位置退一格,即輸出的起始位置左移一位
printf("
_\bIamfine.\n\n");
//回車符'\r',使當前輸出位置回到本行開頭
printf("Iamfine."); printf("\rHowareyou?\n\n");
//多個轉義字符的混合運用
printf("note:\nas\ti\b\bk\rp\n"); return0;}Howareyou?____Iamfine._Howareyou?Iamfine.Howareyou?____Iamfine.
note:p_a_s__ki例3:閱讀程序,給出運行結果Howareyou?__什么時候要使用轉義字符?C程序中需要實現某些特定打印或顯示動作時
如
printf("123\t56\n");C程序中需要打印或顯示以下三個字符時
\
(斜杠)
"
(雙引號)
'(單引號)
如
printf("You'rea
\"abadegg!\"");C程序中需要打印或顯示ASCII表中非鍵盤字符時
如
printf("Look
\16
and
\x80!");注意:使用轉義字符時,\后的八進制或十六進制數不應大于char類型所允許的范圍(十進制值256)。什么時候要使用轉義字符?C程序中需要實現某些特定打印或顯示動字符串常量(String)用雙引號括起的一串字符(可以0個)"Iamastring"""表示空字符串引號只作為字符串開始和結束的標志C語言內部自動用'\0'表示字符串的結束除注釋外,是唯一可以出現中文的地方"A"和'A'是不同的字符'A'65
01000001占1字節
65'\0'字符串"A"占2個字節字符串常量(String)用雙引號括起的一串字符(可以0個)枚舉(Enumeration)常量一個被遺忘的角色從程序來窺其一斑 enumweeks{MON,TUE,WED,THU,FRI,SAT,SUN};
enumweekstoday;
enum
response{no,yes,none};
enum
responseanswer;
today=TUE; answer=yes;
if(answer
==yes) printf("TodayisTuesday.\n");
else
printf("TodayisNOTTuesday.\n");枚舉(Enumeration)常量一個被遺忘的角色宏常量(符號常量)一般用大寫字母表示#define
標識符
字符串不是語句,而是一種編譯預處理命令#include<stdio.h>#definePI
3.14159#defineR
5.3intmain(){ printf("PI*R*R=%f\n",PI*R*R); printf("2*PI*R=%f\n",2*PI*R);
return0;}3.14159*5.3*5.32*3.14159*5.3宏常量(符號常量)一般用大寫字母表示#include<sconst常量用const修飾定義的變量為常量聲明格式: const數據類型常量名=缺省值;注意:常量只能在定義時賦值,而在程序的中間不能改變其值。常數、const常量、宏常量和枚舉常量,都可以用來表示一個永遠不會改變的數。前者不建議直接使用,而用后三者代替例如:constdoublePI=3.14159;floatr,area;area=PI*r*r;const常量用const修飾定義的變量為常量注意:例如:邏輯(布爾)型常量boolean在程序控制中經常用到布爾常量。例如:
if(條件)動作1else動作2布爾常量的值:true(真)和false(假)。C語言中將布爾類型映射為數值類型:
true用非0的整數表示
false用0表示如:
3+1==4
結果為true,通常表示1。inta=2>3結果為false,通常表示0。
邏輯(布爾)型常量boolean在程序控制中經常用到布爾常變量變量在程序執行過程中其值可以改變的量,因此用來記錄運算中間結果或保存數據。變量的聲明:
數據類型變量名1[,變量名2,…,變量名n];決定分配字節數和數的表示范圍合法標識符short,int,long,float,double,char,unsigned
復合類型變量變量在程序執行過程中其值可以改變的量,因此用來記錄運算中變量例:inta,b;doubledata;編譯時,對變量聲明語句將根據其類型分配存儲空間。變量的名實際上對應空間的地址,變量的值對應空間的內容。在對程序編譯連接時由編譯系統給每一個變量名分配對應的內存地址。從變量中取值,實際上是通過變量名找到相應的內存地址,從該存儲單元中讀取數據。a:(2000)b:(3000)data:(4000)4字節8字節4字節變量例:編譯時,對變量聲明語句將根據其類型分配存儲空間。變量例如:
shorts;
//給s變量分配兩個字節,占用2000-2001單元
s=1234;
圖3-1變量與內存單元的映射關系變量例如:圖3-1變量與內存單元的映射關系變量的使用:先聲明,后使用例1:
intstudent; stadent=19;變量的使用:先聲明,后使用例1:變量的使用例2:
floata,b,c; c=a%b;變量的使用例2:變量的聲明位置變量定義位置:一般放在函數開頭intmain(){ inta,b=2; floatdata; a=1; data=(a+b)*1.2; printf("data=%f\n",data); return0;}變量定義可執行語句變量的聲明位置變量定義位置:一般放在函數開頭intmain變量的初始化:聲明變量的同時指定變量初值格式:數據類型變量名=初始值;不被初始化的變量,其值為危險的隨機數變量的初始化#include<stdio.h>intmain(){ charesc='a'; inti; doubleeps=1.0e-5; printf("esc=%c\ni=%d\neps=%lf",esc,i,eps); return0;}運行結果:esc=ai=-858993460eps=0.000010變量的初始化:聲明變量的同時指定變量初值變量的初始化#inc例如:利用變量t交換變量x和y的值t=x;x=y;y=t;tyx變量的值主要通過賦值運算改變。變量值的改變例如:利用變量t交換變量x和y的值tyx變量的值主要通過賦值使用變量要注意不要對變量所占的內存空間字節數想當然用sizeof運算符:返回操作數存儲空間的大小使用形式:sizeof(類型名)或
sizeof(變量名)結果為表達式值所屬類型或者類型占用的字節數sizeof運算符也可以出現在表達式中。例如,x=sizeof(float)-2;
printf("%d",sizeof(double));注意!使用變量要注意不要對變量所占的內存空間字節數想當然注意!為什么要用sizeof獲得類型或變量的字長?因為同種類型在不同的平臺其占字節數不盡相同。比如int在16位、32位和64位系統分別占2、4和8個字節。現象與危害:在平臺間移植時會出現問題,導致數據丟失或者溢出。解決方案:用,并且只用sizeof獲得字長。為什么要用sizeof獲得類型或變量的字長?因為變量的類型整型變量定義形式:
int變量表列;實型變量單精度定義形式:
float變量表列;具有6~7位有效數字雙精度定義形式:
double變量表列;具有15~16位有效數字變量的類型整型變量閱讀程序,給出運行結果#include<stdio.h>intmain(){ longx,y,z; x=-0xffffL;y=-0xffL;z=-0xffffffffL; printf("x=%6ldy=%6ldz=%6ld\n",x,y,z); x=-0xffff;y=-0xff;z=-0xffffffff; printf("x=%6ldy=%6ldz=%6ld\n",x,y,z); return0;}閱讀程序,給出運行結果閱讀程序,給出運行結果#include<stdio.h>intmain(){ shortintx; unsignedy; longz; x=65535; y=65535; z=65535; printf("x=%d\n",x); printf("y=%u\n",y); printf("z=%ld\n",z); return0;}它們在計算機中用二進制表示如下:變量x1111111111111111變量y00000000000000001111111111111111變量z00000000000000001111111111111111%d為基本整型輸出格式說明符%u為無符號基本整型輸出格式說明符%ld為長整型輸出格式說明符閱讀程序,給出運行結果它們在計算機中用二進制表示如下:%d為變量的類型字符型變量即可以存放字符型常量,也可以存放字符的ASCII碼定義方式:
char變量表列;字符變量char(ASCII碼值在0~255之間)與int數據間可進行算術運算例:a='D'; /*a=68;*/x='A'+5; /*x=65+5;*/s='!'+'G'; /*s=33+71;*/沒有字符串變量,用字符數組存放變量的類型字符型變量例:a='D'; /*a=68;char型與int型之間的關系
//小寫字母轉換為大寫字母#include
<stdio.h>intmain(){
char
ch='b';
printf("%c,%d\n",ch,ch);
ch='b'-32;
printf("%c,%d\n",ch,ch); return0;}b,98B,66
ch='b'-('a'-'A');char型與int型之間的關系//小寫字母轉換為大寫字母b一個整型數據占4個字節,而字符型數據只占1個字節(只能存放0-255范圍內的整數),因此,在將整型數據以字符形式輸出時,只取低字節中的數據作為ASCII碼字符輸出。#include
<stdio.h>intmain(){ intx; x=1348; printf("x=%c\n",x); return0;}運行結果為:x=D1348在內存中為:00000000010001000000010100000000一個整型數據占4個字節,而字符型數據只占1個字節(只能存放0實型數據在內存中的存放形式實型數據在內存中按數據的指數形式存儲,一般分三個部分:1)數符(s):0代表正,1代表為負2)指數部分(e):存儲科學計數法中的指數數據,并采用指數移位存儲。n位指數位能表示0-(2n-1),為了表示負指數,采用減個偏移量,如減(2n-1-1)來實現負指數的表示。而存儲時則用實際指數值加偏移量如(2n-1-1)來存入指數部分,這就是指數移位存儲。3)小數部分(f):存放數據科學計數法中的小數數字部分。實型數據在內存中的存放形式實型數據在內存中按數據的指數形式存1)float遵從的是IEEER32.24—指數部分占8位,小數部分占23位2)double遵從的是R64.53—指數部分占11位,小數部分占52位實型數據在內存中的存放形式注意:小數部分占的位(bit)數越多,數的有效數字越多,精度越高。指數部分占的位數越多,則能表示的數值范圍越大。1)float遵從的是IEEER32.24—指數部分占8位將一個float型轉化為內存存儲格式的步驟1)先將該實數的絕對值轉化為二進制格式。
2)將這個二進制格式實數的小數點左移或右移n位,直到小數點移動到第一個有效數字的右邊。
3)從小數點右邊第一位開始數出23位數字放入第22位到第0位。
4)如果實數是正的,則在第31位放入"0",否則放入"1"。
5)指數部分第30到第23位的值為:
n+127(偏移量)對應的二進制代碼(如果n是左移得到的);或
127(偏移量)-n對應的二進制代碼(如果n是右移得到的)。
將一個float型轉化為內存存儲格式的步驟1)先將該實數的絕實型數據在內存中的存放形式實型數據在內存中的存放形式1)將第22位到第0位的二進制數寫出來,在最左邊補一位"1",得到24位有效數字。將小數點點在最左邊那個"1"的右邊。
2)取出第30到第23位所表示的值n,并減去127(偏移量),即為指數。
3)將小數點左移n位(當30位是"0"時)或右移n位(當30位是"1"時),得到一個二進制表示的實數。
4)將這個二進制實數化為十進制,并根據第31位是"0"還是"1"加上正號或負號即可。將一個float型二進制格式轉化為十進制的步驟1)將第22位到第0位的二進制數寫出來,在最左邊補一位"1"實型數據在內存中的存放形式例:給出如下單精度存儲的內存數據(32位):01000010111100010000000000000000,還原該單精度十進制數據。首先將該數據分成三段(1位、8位、23位),在內存中的存儲就為下圖所示:數值部分:1.1110001指數部分:133-127=6(1.1110001*26)2=(1111000.1)2=(120.5)10數值符號實型數據在內存中的存放形式例:給出如下單精度存儲的內存數據(實型數據提供的有效數字位數//閱讀程序,給出運行結果#include
<stdio.h>intmain(){
float
a;
double
b; a=33333.33333; b=33333.33333333333333;
printf("a=%f\nb=%f\n",a,b); return0;}實型數據提供的有效數字位數//閱讀程序,給出運行結果由于實型變量是由有限的存儲單元組成的,因此能提供的有效數字總是有限的。如下例:#include<stdio.h>intmain(){ floata,b; a=123456.789e5; b=a+20; printf("a=%f\n",a); printf("b=%f\n",b); return0;}說明:從運行結果看,誤差明顯。注意:1.0/3*3的結果并不精確等于1。由于實型變量是由有限的存儲單元組成的,因此能提供的有效數字總自動類型轉換同種數據類型的運算結果,還是該類型不同種數據類型的運算結果,是兩種類型中取值范圍更大的那種longdouble>double>float>long>int>short>chardoublelongunsignedintchar,short精度低精度高float說明:必定的轉換運算對象類型不同時轉換自動類型轉換同種數據類型的運算結果,還是該類型doublel自動類型轉換
特別需要說明的是,在混合運算過程中,系統所進行的類型轉換并不改變原數據的類型,只是在運算過程中將其值變成同類型后再運算。例charch;inti;floatf;doubled;ch/i+f*d-(f+i)intdoubledoubleintdoubledoubledoubledouble自動類型轉換特別需要說明的是,在混合運算過程中例:自動類型轉換示例,給出運行結果#include<stdio.h>intmain(){ floatx,y; shortm; longn; x=3/2+8/3; y=3.0/2+8/3.0; m=1*2*3*4*5*6*7*8*9; n=1l*2*3*4*5*6*7*8*9; printf("x=%f,y=%f\nm=%d,n=%ld\n",x,y,m,n); return0;}運行結果:x=3.000000,y=4.166667m=-30336,n=362880例:自動類型轉換示例,給出運行結果運行結果:自動類型轉換把數據賦值給另外一種類型變量會發生自動類型轉換將取值范圍小的類型轉為取值范圍大的類型是安全的反之是不安全的如果大類型的值在小類型能容納的范圍之內,則平安無事但是,浮點數轉為整數,會丟失小數部分,非四舍五入反之,轉換后的結果必然是錯誤的,具體結果與機器和實現方式有關。避免如此使用,好的編譯器會發出警告。自動類型轉換把數據賦值給另外一種類型變量會發生自動類型轉換賦值運算符與賦值表達式簡單賦值運算符符號:=格式:變量標識符=表達式作用:將一個數據(常量或表達式)賦給一個變量例a=3;d=func();c=d+2;賦值運算符與賦值表達式簡單賦值運算符例a=3;賦值運算符與賦值表達式復合賦值運算符符號:+=-=*=/=%=<<=>>=&=^=|=含義:exp1op=exp2
exp1=exp1opexp2n=n+2;n+=2;x*=y+8;x=x*
(y+8);x%=3;x=x%
3;賦值運算符與賦值表達式復合賦值運算符n=n+2;n賦值運算符與賦值表達式說明:結合方向:自右向左左側必須是變量,不能是常量或表達式賦值轉換規則使賦值號右邊表達式值自動轉換成其左邊變量的類型例
3=x-2*y;a+b=3;例floatf;inti;i=10;f=i;則
f=10.0例inti;i=2.56;/*結果i=2;*/賦值運算符與賦值表達式說明:例3=x-2*y;例floa賦值運算符與賦值表達式賦值表達式的值與變量值相等,且可嵌套。a=b=c=5a=5+(c=6)a=(b=10)/(c=2)/*表達式值為5,a,b,c值為5*//*表達式值11,c=6,a=11*//*表達式值5,a=5,b=10,c=2*/a=12;a+=a-=a*a/*a=-264等價于a=a+(a=a-(a*a))*/inta=2;a%=4-1;a+=a*=a-=a*=3;/*a=0等價于a=a+(a=a*(a=a-(a=a*3)))*/賦值運算符與賦值表達式賦值表達式的值與變量值相等,且可嵌套。例:閱讀程序,寫出結果并演算#include<stdio.h>intmain(){ inta=10,b=10; printf("%d\t",a+=a-=a*a); printf("%d",b+=b-=b*=b); return0;}舉一反三:計算a=3時,a*=4+(a%=2)的結果。a=5a=-180b=0賦值運算符與賦值表達式例:閱讀程序,寫出結果并演算舉一反三:a=5a=-180算術運算符與算術表達式表達式:由運算符、操作數(常量、變量、函數調用)和圓括號組成的式子。表達式的書寫形式:中綴式:a+b后綴式:ab+前綴式:+ab例如:inta=1;intb=3;intc=0;c=(-a*b+c+67)*56;算術運算符與算術表達式表達式:由運算符、操作數(常量、變量、算術運算符與算術表達式算術運算符:+-*/%++--加、減、乘、除、求余運算自加自減四則混合運算中,先算乘除,后算加減,按從左向右的順序計算,左結合優先級:
-++--
---->*/%
----->
+-(2)(3)(4)常用的標準數學函數算術運算符與算術表達式算術運算符:常用的標準數學函數算術運算符與算術表達式說明:"-"可為單目運算符時,右結合性C語言規定,兩整數相除,結果為整數%要求兩側均為整型數據例:5/2 =-5/2.0=例
5%2=-5%2=1%10=5%1=5.5%2=2-2.51-110()算術運算符與算術表達式說明:例:例5%2=2-2.51算術運算符與算術表達式算術表達式指用算術運算符將運算對象連接起來的式子對于算術表達式要注意以下幾個問題:1)注意表達式中各種運算符的運算順序,必要時應加括號,例如,(a+b)/(c+d)≠a+b/c+d。2)注意表達式中各運算對象的數據類型,特別是整型相除。例如,
7/6的值為1;4/7的值為0;
(1/2)+(1/2)的值為0,而不是1。算術運算符與算術表達式算術表達式指用算術運算符將運算對象連接增一和減一運算符n++(后綴),n--,(前綴)++n,--n++讓參與運算的變量加1,--讓參與運算的變量減1作為后綴運算符時,先取n的值,然后加/減1作為前綴運算符時,先加/減1,然后取n的值n=n++;n=n;n++;增一和減一運算符n++(后綴),n--,(前綴)++n,--增一和減一運算符n++,n--,++n,--n++讓參與運算的變量加1,--讓參與運算的變量減1作為后綴運算符時,先取n的值,然后加/減1作為前綴運算符時,先加/減1,然后取n的值m=++n;n++;m=n;增一和減一運算符n++,n--,++n,--nm=++n增一和減一運算符例
i=3;printf("%d",-i++);printf("%d",i);++--不能用于常量和表達式,如5++,(a+b)++++--結合方向:
自右向左-(i++)注意-34例inti=3;printf("%d,%d",-i++,i);-3,3說明printf函數的輸出項掃描順序是自右向左的。增一和減一運算符例++--不能用于常量和表達式,如5+//閱讀程序,給出運行結果#include<stdio.h>intmain(){ inta=1,b=1; printf("++a=%d,b++=%d\n",++a,b++); printf("a=%d,b=%d\n",a,b); printf("--a=%d,b--=%d\n",--a,b--); printf("a=%d,b=%d\n",a,b); return0;}運行結果:++a=2,b++=1a=2,b=2--a=1,b--=2a=1,b=1//閱讀程序,給出運行結果運行結果:逗號運算與逗號表達式分隔符一個變量說明語句可以同時定義多個相同類型的變量,這些變量之間就用逗號來分隔。如:intx,y,z;函數參數表中各參數之間也是用逗號來分隔的。printf("x=%d\ny=%d\nz=%",x,y,z);運算符順序求值運算符結合性從左向右逗號運算與逗號表達式分隔符逗號運算與逗號表達式逗號表達式的格式:表達式1,表達式2,…,表達式n求解次序:按從左到右的順序分別計算各子表達式的值逗號表達式的值:等于表達式n的值多數情況下,并不使用整個逗號表達式的值,更常見的情況是要分別得到各表達式的值主要用在循環語句中,同時對多個變量賦初值等
for(i=1,j=10;i<j;i++,j--)循環起始條件循環結束條件循環增量逗號運算與逗號表達式逗號表達式的格式:循環起始條件循環結束條例:閱讀程序,給出運行結果#include<stdio.h>intmain(){ intx,y=7; floatz=4; x=(y=y+6,y/z); printf("x=%d\n",x); return0;}運行結果:x=3逗號運算與逗號表達式例:閱讀程序,給出運行結果運行結果:x=3逗號運算與逗號表達閱讀程序,給出運行結果intmain(){ inta=3,b=4,c=1,max,t; if(a>b,a>c)max=a; elsemax=0; t=(a+3,b+1,++c); printf("max=%d,t=%d\n",max,t); return0;}運行結果:max=3,t=2逗號運算與逗號表達式舉一反三:判斷輸出結果printf("%d,%d\n",(3,4,5),(a=3,a=0,a+=2));運行結果:5,2閱讀程序,給出
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 裝配式建筑樓梯預制安裝與節能減排工程服務合同
- 康復病人護理全流程管理
- 遺產官司贍養協議書
- 車位分期貸款協議書
- 集體土地合同協議書
- 風貌塑造安全協議書
- 衛生間服務合同協議書
- 解除環衛合同協議書
- 車輛備案代辦協議書
- cnc工廠學徒協議書
- 工程勞務合作協議書
- 專利代理師考試題庫有答案分析2024年
- 電表過戶借用協議書
- 老年人房顫的綜合管理
- 2023-2024學年四年級數學下學期開學摸底考試(A4版)(人教版)
- 私人合同協議書模板
- 《城鎮房屋租賃合同(示范文本)》(GF-2025-2614)
- 與信仰對話 課件-2024年入團積極分子培訓
- DZ∕T 0227-2010 地質巖心鉆探規程(正式版)
- 2024年貴州省糧食儲備集團有限公司招聘筆試參考題庫附帶答案詳解
- 民法典合同編之違約責任實務解讀PPT
評論
0/150
提交評論