C基础及其教程 10_第1页
C基础及其教程 10_第2页
C基础及其教程 10_第3页
C基础及其教程 10_第4页
C基础及其教程 10_第5页
已阅读5页,还剩101页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章数据类型、运算符与表达式C语言大学实用教程本章学习内容标识符命名;变量和常量;数据类型;常用运算符和表达式;运算符的优先级与结合性CProgramStructureStillrememberthisdiagram?PreprocessorInstructionintmain(void){return0;}StatementGlobalDeclarationLocalDeclaration例2.1:一个简单的C程序例子#include<stdio.h>/*函数功能:计算两个整数相加之和

入口参数:整型数据a和b

返回值:整型数a和b之和*/int

Add(inta,intb){

return(a+b);}/*主函数*/intmain(void){

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;}并列的两个函数其中一个是程序的入口程序注释编译预处理命令C程序常见符号分类关键字(Keyword)又称保留字(CReservedWord)AwordthathasspecialmeaninginC标识符(Identifier)CStandardIdentifier(系统预定义标识符)Awordhavingspecialmeaningbutmayberedefined(butisnotrecommended!!)用户自定义标识符变量,函数名,…C程序常见符号分类运算符(Operator)34种,详见附录2

分隔符(Separator)空格、回车/换行、逗号等其它符号“{”和“}”标识函数体或语句块“/*”和“*/”程序注释的定界符常量(Constant)标识符命名变量名,函数名由英文字母、数字和下划线组成,大小写敏感不可以是数字开头直观,见名知意,便于记忆和阅读最好使用英文单词或其组合切忌使用汉语拼音下划线和大小写通常用来增强可读性variablenamevariable_namevariableName不允许使用关键字作为标识符的名字

int,float,for,while,if等某些功能的变量采用习惯命名如:for语句所采用的循环变量习惯用i,j,kWindows风格UNIX风格P45,2.1何谓变量(Variable)?Anameassociatedwithamemorycellwhosevaluecanchange#include<stdio.h>intAdd(inta,intb){ returna+b; }intmain(void) { intx,y,sum=0;

printf("Inputtwointegers:");

scanf("%d%d",&x,&y); sum=Add(x,y);

printf("sum=%d\n",sum);

return0;}如何衡量变量所占空间大小?bit,中文叫法:位Byte,中文叫法:字节Kilobyte(KB),中文叫法:

KMegabyte(MB),中文叫法:兆Gigabyte(GB),中文叫法:GTerabyte(TB),中文叫法:T1TB==

1,024GB1GB

==

1,024MB1MB

==

1,024KB1KB

==

1,024B1B==

8b一个位有多大?只能是“0”或者“1”,二进制一个字节有多大?可以表示数字0~255之间的整数保存一个字符(英文字母、数字、符号)ASCII(美国标准信息交换码)编码如何衡量变量所占空间大小?Needstobedeclared:

变量类型变量名;Example:

intsum;intx,y,sum=0;变量声明(VariableDeclaration)#include<stdio.h>intAdd(inta,intb){ returna+b; }intmain(void) { intx,y,sum=0;

printf("Inputtwointegers:");scanf("%d%d",&x,&y); sum=Add(x,y);

printf("sum=%d\n",sum);

return0;}变量声明(VariableDeclaration)使用变量的基本原则变量必须先定义,后使用所有变量必须在第一条可执行语句前定义声明的顺序无关紧要一条声明语句可声明若干个同类型的变量声明变量是初始化变量的最好时机不被初始化的变量,其值为随机数

结果会是什么?Example:intnumber1,number2;number1=25;number2=23;number1=number2;…… number1?number2?252323变量赋值(VariableAssignment)Algorithm

变量

表达式

Syntax

变量=表达式

;Rules:类型一致Expression’stypemustbethesameasvariable’stypeValidExample:

InvalidExample:

intx; inty; x=12; y=5.75;变量赋值(VariableAssignment)Example:Calculateanddisplaythepriceofanumberofapplesifthequantityinkgandpriceperkgaregiven.Input:

quantityandpricePerkgOutput:

priceProcess:

price=quantity*pricePerkg变量赋值(VariableAssignment)Example:intquantity;floatpricePerkg,price;quantity=5;pricePerkg=4.50;price=quantity*pricePerkg;…Howdoesthisprogramwork?变量赋值(VariableAssignment)Example:intquantity;floatpricePerkg,price;quantity=2;pricePerkg=4.50;price=quantity*pricePerkg;…quantity?pricePerkg?price?4.509.002变量赋值(VariableAssignment)Example:intquantity;floatpricePerkg;floatprice;Whydidwedeclareitasint?Whydidwedeclarethemasfloat?变量类型(VariableType)数据类型(DataType)为什么要区分类型?不同类型有什么不同?数据表示形式合法的取值范围占用内存空间大小可参与的运算种类数据类型(DataType)基本数据类型int整数,在目前绝大多数机器上占4个字节TC2.0,2个字节float单精度浮点数,4个字节double双精度浮点数,8个字节char字符,1个字节表示256个ASCII字符,或0~255的整数数据类型修饰符shortshort

int,简写为short,短整数,2个字节longlong

int,简写为long,长整数,4个字节long

double,长双精度(高精度)浮点数,12个字节unsigned用来修饰char、int、short和long无符号整数(正整数和0)不同类型取值范围不同C语言直接提供的任何类型都有取值范围。整型类型的取值范围浮点类型的取值范围不同类型取值范围不同C语言直接提供的任何类型都有取值范围。当向其赋超过此范围的数值时,结果会怎样呢?产生数值类型溢出,得到一个不正确的结果。小蛇能吞下大象吗?typeoverflow.c何谓类型溢出(Overflow)?生活中的例子:身份证号码中的出生年阿利亚娜号火箭发射失败现象与危害:溢出后的数值是可预料的,但不同平台会有所不同当程序从高位计算机向低位计算机移植(比如从64位系统移植到32位系统)时,以前从不出现的溢出问题可能出现解决方案?预先估算运算结果的可能范围,采用取值范围更大的类型。1+2+3+…1!+2!+3!+…13+23+33+…在运算还没开始之前就判断运算数是否在合理的取值范围内。如果超出,则停止运算,转错误处理。不同类型占用的内存字节数不同因为同种类型在不同的平台其占字节数不尽相同。如int在16位、32位和64位系统分别占2、4和8个字节。不要对变量所占的内存空间字节数想当然用sizeof获得变量或者数据类型的长度现象与危害:在平台间移植时会出现问题,导致数据丢失或者溢出注意!sizeof到底是什么?C语言的关键字,并非函数计算类型占用的字节数两种语法形式

sizeof(类型)结果为类型占用的字节数

sizeof(表达式)结果为表达式值所属类型占用的字节数一般都使用sizeof(变量名)

例2.3显示各种数据类型所占内存的字节数#include<stdio.h>intmain(void){

printf("DatatypeNumberofbytes\n");

printf("---------------------------------\n");

printf("char%I64d\n",sizeof(char));

printf("int%I64d\n",sizeof(int));

printf("shortint%I64d\n",sizeof(short));

printf("longint%I64d\n",sizeof(long));

printf("longlong%I64d\n",sizeof(longlong));

printf("float%I64d\n",sizeof(float));

printf("double%I64d\n",sizeof(double)); return0;}例2.3显示各种数据类型所占内存的字节数longdouble是C/C++中用于扩展精度的浮点数据类型,其具体大小(字节数)并非由语言标准统一规定,而是高度依赖于编译器、目标平台和操作系统架构。在不同版本的Code::Blocks下输出结果可能为12或16。在VSCode中使用不同的编译器插件编译运行,输出的结果可能为12或者16。在VisualStudio2022下运行输出的结果则为8。不同类型数据

在内存中的存储形式不同字符型整型实型N=S×2j阶码符号阶码的数值尾数符号尾数的数值阶码j尾数S所占位数决定实数的取值范围所占位数决定实数的精度常量(Constant)AvaluethatwillnotchangeConsistsof:整型(e.g.067-2

123L123u

0220x12)缺省为int实型(e.g.2.31.2e-52.73F2.73L)缺省为double字符型(e.g.'z''3''$''\n')用\开头的字符为转义字符,代表1个字符字符串(e.g."UKM""1""5a")常量(Constant)字符常量转义字符一些特殊字符(无法从键盘输入或者另有它用)用转义字符表示字符常量字符常数就是一个普通整数,也可参与各种数学运算每个字符具有一个0~255之间的数值,可从ASCII表查出注意:’5’和整数5的区别’5’的ASCII码值是53字符的数学运算在密码学内用得比较多例2.5:小写字母转换为大写字母#include<stdio.h>intmain(void){

char

ch='b';printf("%c,%d\n",ch,ch);

ch='b'-32;

printf("%c,%d\n",ch,ch);

return0;}#include<stdio.h>intmain(void){

char

ch='b';printf("%c,%d\n",ch,ch);

ch='b'-('a'-'A')

;

printf("%c,%d\n",ch,ch);

return0;}b,98B,66

b,98B,66

相当于97-65字符串常量用双引号括住的由0个或多个字符组成的字符序列"Iamastring"""表示空字符串除注释外,是唯一可以出现中文的地方C语言内部用’\0’表示字符串的结束"x"和’x’是不同的<string.h>里定义了一系列专门的字符串处理函数转义字符也可在字符串中使用习题2.2(4)字符串"\t\"Name\\Address\n"的长度?15宏常量

#define

标识符字符串宏常量也称符号常量一般采用全大写字母表示宏定义不是语句,而是一种编译预处理命令例2.2:计算圆的周长和面积#include<stdio.h>#definePI3.14159#defineR5.3intmain(void){

printf("area=%f\n",PI*R*R);

printf("circumference=%f\n",2*PI*R);return0;}area=88.247263circumference=33.300854相当于执行#include<stdio.h>intmain(void){

printf("area=%f\n",3.14159*5.3*5.3);

printf("circumference=%f\n",2*3.14159

*5.3);return0;}宏替换例2.2:计算圆的周长和面积#include<stdio.h>#definePI3.14159;#defineR5.3;intmain(void){

printf("area=%f\n",PI*R*R);

printf("circumference=%f\n",2*PI*R);return0;}相当于执行#include<stdio.h>intmain(void){

printf("area=%f\n",3.14159;*5.3;*5.3;);

printf("circumference=%f\n",2*3.14159;*5.3;);return0;}语法错误例2.2:计算圆的周长和面积#include<stdio.h>intmain(void){

constfloat

pi=3.14259;

constfloatr=5.3;

printf("area=%f\n",pi*r*r);

printf("circumference=%f\n",2*pi*r);return0;}用const修饰定义的const常量const常量与宏常量相比的优点是什么?const常量有数据类型某些集成化调试工具可以对const常量进行调试枚举(Enumeration)常量一个被遗忘的角色,从程序来窥其一斑

enumweeks{SUN,MON,TUE,WED,THU,FRI,SAT};

enumweekstoday;

enumresponse{no,yes,none};

enumresponseanswer;

today=TUE;

answer=yes;

enumresponse{no=-1,yes=1,none=0};

其值为2其值为1为什么需要常量?假如不使用常量,直接使用常数,会有什么影响?程序的可读性变差容易发生书写错误当常数需要改变时,要修改所有使用它的代码,工作量大,还可能有遗漏解决方案:避免使用幻数(直接使用的常数)把幻数定义为宏常量、const常量,或枚举常量建议使用后两者运算符(Operator)34种,详见附录2常见的运算符算术运算符赋值运算符类型强转关系运算符逻辑运算符增1和减1位运算符运算符和操作数

(OperatorandOperand)Example:W+ZOperandOperatorOperandWhatareoperatorandoperand?算术运算符(ArithmeticOperators)Addition(+)Subtraction(-)Multiplication(*)Division(/)Modulus(%)Multiplication(*),addition(+)

and

subtraction(-)arethesimplesttouseDivision(/)

iseasy,butsomeprecautionsneedtobetakenModulus(%)

istheonethatnormallyconfusesnovicesSo,let’sstudyindetailthe

Division

and

Modulus算术运算符(ArithmeticOperators)除法(Division)Example:W/Z浮点数除法FloatingDivisionWorZorbotharefloats整数除法IntegerDivisionWandZareintegers自动类型转换相同类型数据的运算结果,还是该类型不同类型数据的运算结果,是两种类型中取值范围大的那种long

double>double>float>long>int>short>chardoublefloatlongunsignedintchar,short低高Example:整数除法(IntegerDivision)8/2=4anintegeraninteger

theresultisalsoanintegerExample:12/5=2anintegeraninteger

theresultisalsoaninteger整数除法(IntegerDivision)Example:实数除法(FloatingDivision)12.0/5=2.4afloatanintegertheresultisafloatWhatwillbetheanswerifanintegerisdividedby0?Somethingtoponder…求余(Modulus)Itreturnsthe

remainder

thatoccursafterperformingthedivisionof2operandsRule:

操作数必须是整数Operandsmustbe

integersExample:12%5=2anintegeranintegertheresultistheremainderof12/51252102remainderresult求余(Modulus)Howaboutifoneoftheoperandsisanegativeinteger?Somethingtoponder…Example:-7%3=-1anintegeraninteger-73-2-6-1remainderresulttheresultistheremainderof-7/3求余(Modulus)Example:7%-3=1anintegeraninteger7-3-261remainderresulttheresultistheremainderof7/-3求余(Modulus)Example:12.0%3=??afloatanintegerINVALID!

求余(Modulus)Anexpressionmaycontain2ormorearithmeticoperatorsMainissue:运算顺序

ORDEROFPRECEDENCE

优先级算术表达式

(ArithmeticExpression)Examples:5+65+6*22.5+6–2*212/6.0–2*2=11=22or17?=??=??=17算术表达式

(ArithmeticExpression)Waitaminute

优先级(OrderofPrecedence)

High: */%

Low: +-Alloperatorshaveaprecedencelevel.不同优先级时的运算顺序:Highprecedenceleveloperatorsareevaluatedbeforelowerones.相同优先级时的运算顺序:Operatorsofthesameprecedencelevelareevaluatedfromlefttoright(左结合)算术表达式

(ArithmeticExpression)Example:??48.52.5+6–

–44.52.5+6–2*2=算术表达式

(ArithmeticExpression)4.5巧妙使用圆括号改变运算顺序AllexpressionsinparenthesesmustbeevaluatedpriortovaluesoutsidebracketsNestedparenthesizedexpressionsmustbeevaluatedfromtheinsideout,withtheinnermostexpressionevaluatedfirstExample:(9–(3+2))*3=??算术表达式

(ArithmeticExpression)Example:

(9–(3+2))*3=??

–5412

(9–(3+2))*3=12算术表达式

(ArithmeticExpression)赋值语句

(AssignmentStatement)Thereare3typesofassignment:Simple——简单赋值Multiple——多重赋值Shorthand——简写的复合赋值简单赋值

SimpleAssignmentSyntax:

变量=

表达式;Don’tforgetthesemicolon!!Everyassignmentexpressionhasavalue#include<stdio.h>main(){floatprice,discount,total;printf(“Buyingprice:“);scanf(“%f”,&price);printf(“\nDiscountrate:“);scanf(“%f”,&discount);total=price*discount;printf(“Thetotalpriceis%.2f\n”,total);}Buyingprice:_discount??price??

total??Buyingprice:10.00_10.00Buyingprice:10.00Discountrate:_Buyingprice:10.00Discountrate:0.25_0.252.50Buyingprice:10.00Discountrate:0.25_Buyingprice:10.00Discountrate:0.25Thetotalpriceis2.50_Example:简单赋值

SimpleAssignmentSyntax:变量1=

变量2=

表达式;多重赋值

MultipleAssignmentDon’tforgetthesemicolon!!Example:intnumber,total;floatstart_x,start_y;...number=total=0;start_x=start_y=100.0;total??number??start_x??start_y??00100.0100.0多重赋值

MultipleAssignment从右向左赋值Syntax:

变量x=变量x

运算符op

表达式;

变量x

运算符op=表达式;

简写的复合赋值

ShorthandAssignment这种形式看起来更直观,且执行效率一般也更高一些Whenevertheexpressionontherightcontainsthevariableontheleft(towhichthevalueisassigned)Example:num=num+5;num15

15+5

2020简写的复合赋值

ShorthandAssignmentExpressionscanalsobestatedusingshorthandassignmentoperatorsExample:num+=5;similarto

num=num+5shorthandassignmentoperator简写的复合赋值

ShorthandAssignment习题2.2(7)已知inta=3;执行a+=a-=a*a后,变量a的值?a+=a-=a*aa+=a-=9a+=-6

a=-12简写的复合赋值

ShorthandAssignment3-6-12习题2.2(7)已知inta=3;执行a+=a-=a*=a后,变量a的值?a+=a-=a*=aa+=a-=9a+=0

a=0简写的复合赋值

ShorthandAssignment3900OperationExamplesofexpressionDescription+=num+=5;num=num+5;-=num-=5;num=num–5;*=num*=5;num=num*5;/=num/=5;num=num/5;%=num%=5;num=num%5;简写的复合赋值

ShorthandAssignment自动类型转换取值范围小的类型赋值给取值范围大的类型是安全的反之是不安全的若大类型的值在小类型能容纳的范围之内,则平安无事但是,浮点数转为整数,会丢失小数部分,非四舍五入反之,转换后的结果必然是错误的,具体结果与机器和实现方式有关避免如此使用,好的编译器会发出警告自动类型转换Example:

intx=10; floaty; y=(float)x;

(float)10

10.000000x10y??10.000000类型强转(Casting)消除从大到小的警告

x=(int)y;通过下面方式把表达式的值转为任意类型

(类型)表达式不改变xExample:

inttotal,number; floataverage; … average=total/number;

15/2

7total15number2average??7.000000类型强转(Casting)两个整数运算的结果还是整数,不是浮点数Example:

inttotal,number; floataverage; … average=(float)total/number;

15.000000/2

7.500000total15number2average??7.500000类型强转(Casting)关系运算符

(RelationalOperators)OperationDescriptionExamplesofExpressionValue<Lessthan6<91(true)<=Lessthanorequalto5<=51(true)>Greaterthan2>60(false)>=Greaterthanorequalto9>=51(true)==Equalto7==50(false)!=Notequalto6!=51(true)Symbol

Description

&& 与(AND)当且仅当两者都为真,则结果为真|| 或(OR)只要两者中有一个为真,结果就为真! 非(NOT)aba&&ba||b!a!b000011010110100101111100逻辑运算符

(LogicalOperators)!&&||高低复合表达式

(CompoundExpression)Arithmetic,relationalandmanticoperatorscanbeintegrated/combinedinoneexpressionExample:!(c>a)a2b5c15d17

!(1)

!(15>2)

0Example:(a>=1)&&(b==5)

(2>=1)&&(b==5)

1&&(b==5)

1&&(5==5)

1&&1

1a2b5c15d17复合表达式

(CompoundExpression)Example:(c>=(b*3))||(a==3)

(c>=(5*3))||(a==3)

1||(a==3)

1||(2==3)

1||0

(15>=15)||(a==3)

1a2b5c15d17复合表达式

(CompoundExpression)Example:!((a<b)||(c>d))

!((2<5)||(c>d))

!(1||(15>17))

!(1||0)

!1

!(1||(c>d))

0a2b5c15d17复合表达式

(CompoundExpression)实例ch是英文大写字母(ch>='A')&&(ch<='Z')判断某一年year是否是闰年的条件是满足下列二者之一能被4整除,但不能被100整除;能被400整除;

year%4==0&&year%100!=0||year%400==0优先级:%

==(!=)

&&

||((year%4==0)&&(year%100!=0))||(year%400==0)复合表达式

(CompoundExpression)增一和减一运算符

(IncrementandDecrement)

n++,n--,++n,--n++让参与运算的变量加1,--让参与运算的变量减1作为后缀(postfix)运算符时,先取n的值,然后加/减1m=n++;m=n;n++;增一和减一运算符

(IncrementandDecrement)

n++,n--,++n,--n++让参与运算的变量加1,--让参与运算的变量减1作为后缀(postfix)运算符时,先取n的值,然后加/减1作为前缀(prefix)运算符时,先加/减1,然后取n的值m=++n;n++;

m=n;Example:j=++i-2i5similartoi=i+1;j=i–2;j??46前缀(Prefix

)增一和减一运算符Example:j=i++-2i5similartoj=i–2;i=i+1;后缀(Postfix)增一和减一运算符j??36习题2.4(8):输出结果和变量a的值?inta=3;printf("%d",-a++);a3similartoprintf("%d",-a);a=a+1;后缀(Postfix)增一和减一运算符4增一和减一运算符良好的程序设计风格提倡:在一行语句中,一个变量只能出现一次增1或者减1运算过多的增1和减1运算混合,不仅可读性差,而且因为编译器实现的方法不同,导致不同编译器产生不同的运行结果Symbol

Description

&& 与(AND)当且仅当两者都为真|| 或(OR)只要两者中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论