《C语言程序设计》课件-第2章 C程序设计基础_第1页
《C语言程序设计》课件-第2章 C程序设计基础_第2页
《C语言程序设计》课件-第2章 C程序设计基础_第3页
《C语言程序设计》课件-第2章 C程序设计基础_第4页
《C语言程序设计》课件-第2章 C程序设计基础_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计智能工程学院“现场课程”

录目录CONTENTS

C程序组成元素2.1

运算符和表达式2.4

常量2.2

变量2.3

数据类型转换2.5下面我们首先来看一个简单的C程序:#include<stdio.h> /*编译预处理指令*/intmain() /*主函数的函数头*/{ /*函数体的开始标记*/ inta,b,c; /*定义3个整型变量*/ scanf("%d%d",&a,&b); /*运行程序时,分别为a,b输入整数值*/ c=a+b; /*计算a+b的值,将结果赋值给c*/ printf("a=%d,b=%d,c=%d\n",a,b,c); /*依次输出a,b,c的值*/ return0; /*程序返回值0*/} /*函数的结束标记*/由该程序可以看出,C程序中主要包括了关键字、变量、常量、运算符、标识符、分隔符、其他符号等。下面我们就来介绍一下这些元素及其特点。关键字变量常量运算符

2.1

C程序组成元素2.1.1C语言程序的格式特点标识符C语言中规定具有特别意义的字符串称为关键字,亦称保留字,关键字不能用作它用。C语言的关键字共有37个,如表所示。chardoubleenumfloatintlongshortsignedstructunionunsignedvoidfordowhilebreakcontinueifelsegotoswitchcasedefaultreturnautoexternregisterstaticconstsizeoftypedefvolatileinlinerestrict_Bool_Complex_Imaginary

2.1

C程序组成元素2.1.2关键字总体而言,C语言中的关键字大致可以分为以下几类:数据类型说明符,如整型int,字符型char等。语句定义符,如选择结构中的if、else,循环结构中的for、while、do等。存储类型关键字,如声明自动变量的auto,声明静态变量的static等。其他关键字,如声明常量的const等。

2.1

C程序组成元素12342.1.2关键字所谓变量,是指程序运行过程中其值可以改变的量,如上例中的a,b,c。所谓常量,是指程序运行过程中其值不变的量,如上例中的0。我们在本章稍后会对C语言中的常量和变量进行更为详细的解释。

2.1

C程序组成元素2.1.3变量与常量所谓标识符,指的是编程人员在编写程序时自己规定的具有特定含义的词,用来标明设定的变量名、数组名、函数名等。在C语言中,标识符应遵循以下一些命名规则。标识符只能由字母、下划线、数字组成,且第一个字符必须是字母或下划线,不能是数字。如abc,_abc1,str_2都是合法的标识符,但2abc,2_abc,&123,%lsso,M.Jack,-L2都是错误的标识符。标识符区分英文字母大小写,如score和Score是两个不同的标识符。标识符不能是C语言中的关键字。

2.1

C程序组成元素2.1.4标识符123

提示1.虽然从语言标准来说,C语言并未对标识符的长度作出限制,但在实际使用中,其长度会受到具体编译系统和机器环境的制约。比如,某些编译器规定标识符的前8个字符为有效区分部分,若两个标识符的前8个字符完全相同,会被视作同一个标识符。2.在命名标识符时,应尽量让其名称能够体现出所代表的含义,做到“见名知义”。这样可以显著提升程序的可读性,例如表示学生姓名的变量,可命名为StuName。3.在C程序的标识符中,只能使用英文字母(包括大写和小写)、数字以及下划线(_)。需要注意的是,像!、#、&等其他英文特殊符号是不允许用于标识符的。不过,在程序的注释以及字符串常量中,则可以使用包括汉字和中文标点在内的任意字符。

2.1

C程序组成元素2.1.4标识符在C语言中,为了指明每个变量、函数可存储什么类型的数据,以及可以进行哪些运算或操作,系统提供了多种数据类型。数据类型不同,其在内存中占用的存储空间大小也有所不同。在C语言中,数据类型可分为四类,它们分别是基本类型、构造类型、指针类型和空类型,如图所示。其中,基本类型又可细分为整型、实型、字符型和枚举型;构造类型包括数组类型、结构体类型和共用体类型。在本章中,我们将主要介绍C语言的基本类型,对于其他数据类型,将在后面各章陆续介绍。

2.1

C程序组成元素2.1.5数据类型

知识拓展

2.1

C程序组成元素整型常量即整常数,C语言中整型数据可以有以下三种表示形式:十进制整数,由数字0-9组成,不能以0开头(数字0本身除外)。示例:0、123、-456、10086。八进制整数。以数字0开头,后面跟由0-7组成的数字序列。示例:012(对应十进制的10)、077(对应十进制的63)、-010(对应十进制的-8)。十六进制整数。以0x或0X开头,后面跟由0-9、A-F(或a-f)组成的数字序列(A-F表示10-15)。示例:0x1A(对应十进制的26)、0Xff(对应十进制的255)、-0x20(对应十进制的-32)。

提示这三种形式在程序中可以根据需求灵活使用,编译器会自动将它们转换为二进制形式存储。例如,10(十进制)、012(八进制)、0xa(十六进制)在内存中都表示同一个整数(十进制值为10)。

2.2

量2.2.1整型常量123实型数据指带小数的数值(实数),又称浮点数(因小数点是“浮动的”而得名)。C语言中实型常量只用十进制形式表示,但其表示方式也有两种:小数形式。由整数部分、小数点和小数部分组成,必须包含小数点。可以只有整数部分和小数点(此时小数部分默认为0),如3.、-100.,可以只有小数点和小数部分(此时整数部分默认为0),如.5、-.89,也可以同时包含整数部分、小数点和小数部分,如3.14、-0.618。指数形式,由十进制数、指数符号e或E以及指数部分组成,格式为:aEn(表示a×10ⁿ)。其中a是小数形式的实数(可以带正负号),n是十进制整数(可正可负)。示例:1.23e5(表示1.23×10⁵,即123000)、3.14E-2(表示3.14×10⁻²,即0.0314)、-5e3(表示-5×10³,即-5000)。

注意:指数形式中,e或E前后必须有数字,且指数部分必须是整数。例如e3、5e、3.2e1.5都是不

合法的表示。

2.2

量2.2.2实型常量12字符型常量包括字符常量、字符串常量和转义字符。字符常量1C语言中字符常量必须用单撇号(单引号)括起来,且单撇号中只能是单个字符。如'A'、'a'、'3'、'*'是正确的,'cd'、’12’、’!@’是错误的。字符型数据在C语言中是以ASCII码形式存储的,字符常量的值就是其对应的ASCII码的值。如字符'a'的ASCII码值为97,'A'的ASCII码值为65。因为ASCII码值为整型,所以C语言中字符型数据与整型数据可以互用,例如,'a'-32相当于97-32,等于65,对应的字符为'A';同理,'A'+32为字符'a'。这也是字母大小写转换的一种方法。

提示字符'8'和整数8是不同的概念,字符'8'只是代表一个符号,在内存中以ASCII码形式存储,对应的ASCII码值为56,而整数8在内存中存储的就是数值8。

2.2

量2.2.3字符常量字符串常量2除单个字符外,C语言还可以处理多个字符组成的常量,称为字符串常量。字符串常量是一对双撇号(双引号)括起来的一个或多个字符,例如,"A","China","Howareyou!"等。C语言中存储字符串常量时,系统会在字符串的末尾自动加一个'\0'作为字符串的结束标志。例如,字符串常量"China"在内存中的存储形式如图所示。

提示字符串常量不能被修改(存放在常量区),例如不能直接给"hello"中的字符赋值。连续的字符串常量会被自动拼接,例如"ab""cd"等价于"abcd"。空字符串""仅包含结束符'\0',占1字节内存。

2.2

量2.2.3字符常量转义字符3C语言中还有一类特殊字符,无法直接输入或有特殊含义的字符,需用转义字符表示(以反斜杠开头)称为转义字符。转义字符通常用来表示一些控制代码和功能定义,例如,例1-1中的语句“printf("欢迎您学习C语言!\n");”中,“\n”表示换行。C语言中常用的转义字符如表所示。转义字符说明转义字符说明\n回车换行\'单引号符'\b退格\"双引号符"\r回车\a鸣铃\t水平制表\f走纸换页\v垂直制表\ddd1~3位八进制数所代表的字符\\反斜线符\\xhh1~2位十六进制数所代表的字符实际上,任何一个字符都可以用转义字符\ddd或\xhh来表示,ddd和hh分别为八进制和十六进制的ASCII码,例如,'\101'表示字母'A','\134'表示右斜杠,'\X0A'表示换行等。

2.2

量2.2.3字符常量符号常量,即以一个标识符来代表某一个字面常量,它通常利用C语言的宏定义命令#define来声明,格式为:#define标识符

常量值。其中:#define是预处理命令(不是语句,末尾不需要分号);标识符是符号常量的名称,通常使用大写字母(约定俗成,便于区分);常量值可以是整数、实数、字符、字符串等;示例:特点与作用:①替代作用,编译预处理阶段,编译器会将代码中所有出现的符号常量标识符替换为对应的常量值(宏替换);②提高可读性,用有意义的标识符(如PI、MAX_AGE)代替直接写数值,使代码更易理解;③便于修改,当需要修改常量值时,只需修改#define定义处,无需逐个修改代码中所有出现该值的地方。注意事项:①符号常量定义后不能被修改,也不能对其赋值(如PI=3.14;是错误的);②定义时标识符与常量值之间是空格,不是等号;③通常在程序开头定义符号常量,以便整个程序都能使用。

2.2

量2.2.3符号常量【例2-1】已知圆的半径,求圆的周长和面积。【问题分析】在本例中,可以使用符号常量来表示圆周率,在运行时先显示文字,提示用户输入圆的半径值。用户输入值后,经过计算就可以得到圆的周长和面积,最后将计算结果显示出来。

2.2

量2.2.3符号常量【参考代码】#include<stdio.h>#definePI3.14159 /*使用符号常量表示圆周率*/intmain(){ doubler,l,s; /*定义双精度型变量半径r,周长l和面积s*/ printf("请输入圆的半径:"); /*输出提示语*/ scanf("%lf",&r); /*输入半径r的值*/ l=2*PI*r; /*计算周长l*/ s=PI*r*r; /*计算面积s*/ printf("圆的周长为%f,圆的面积为%f\n",l,s); /*输出周长l和面积s*/ return0; /*程序返回值0*/}

2.2

量2.2.3符号常量【运行结果】程序运行结果如图所示。【程序说明】用格式输入函数scanf输入双精度型数据时,输入格式为%lf;用格式输出函数printf输出双精度型数据时,输出格式为%f,关于格式输入输出函数将在第后续章节中详细介绍。

2.2

量2.2.3符号常量变量的定义:变量在使用前必须先定义,变量定义的过程其实是为变量在内存中开辟储存单元的过程。变量定义的基本格式为:数据类型

变量名;数据类型决定变量存储的数据类型(如整数、浮点数、字符等),例如int、float、char等。变量名遵循标识符命名规则(由字母、数字、下划线组成,不能以数字开头,不能是关键字)。示例:intage;//定义一个整型变量agefloatscore;//定义一个单精度浮点型变量scorechargender;//定义一个字符型变量gender也可以在定义时同时初始化(赋值):intnum=10;//定义整型变量num并初始化为10floatpi=3.14f;//定义浮点型变量pi并初始化为3.14charch='A';//定义字符变量ch并初始化为'A'变量的本质:变量本质上是内存中的一块存储空间,用于存放数据:定义变量时,编译器会根据数据类型分配相应大小的内存(例如int通常占4字节,char占1字节)。变量名相当于这块内存空间的“别名”,通过变量名可以访问或修改内存中的数据。变量的使用规则:先定义后使用:C语言要求变量必须先定义,后使用,否则会报错。

错误示例:使用未定义的变量intmain(){x=5;//错误,x未定义return0;}

2.3

变量整型变量是用来存储整数的变量。整型可分为两大类:有符号型和无符号型。有符号整数指的是数值可以带正负号,所以需要一个符号位;无符号整数指的是数值只有正数,所以可以去掉符号位。默认情况下,C语言中的整型变量都是有符号的,若要告诉编译器变量是无符号整数,需要把它声明成无符号类型(用关键字unsigned表示)。

拓展阅读我们知道,数据是以二进制形式存储在计算机中的。整数在存储单元中的存储方式是以补码形式存放的。一个正数的补码是此数的二进制形式,一个负数的补码是由该数绝对数的二进制数按位取反后加1得到。

2.3

变量2.3.1整型变量为了适应不同的应用场合,C语言提供了多种整数类型,其长度各不相同。其中,常用的有符号整型(用关键字int表示)长度为32位(4个字节)。此外,考虑到有些程序所需的数很大,C语言为此提供了长整型(用关键字long表示);如果程序中整数的值都不大,为了节省空间,可使用C语言提供的短整型(用关键字short表示)。

提示不同的编译器,分配给整型变量的存储空间的大小是不一样的。如TurboC2.0为每个整型数据分配2个字节(16位),而VisualC++6.0为每个整型数据分配4个字节(32位)。在本书中,我们采用VisualC++6.0编译器中的规定。

2.3

变量2.3.1整型变量编写程序时,可以指明变量是长整型或短整型,有符号整型或无符号整型,还可以把说明符组合起来。因此,整型变量可以分为有符号基本整型、无符号基本整型、有符号短整型、无符号短整型、有符号长整型和无符号长整型这6种类型。具体的关键字表示和各类型的取值范围如表所示。类型名称关键字表示字节数最小值最大值有符号基本整型[signed]int4-2147483648(-231)2147483647(231-1)无符号基本整型unsigned[int]404294967295(232-1)有符号短整型[signed]short[int]2-32768(-215)32767(215-1)无符号短整型unsignedshort[int]2065535(216-1)有符号长整型[signed]long[int]4-2147483648(-231)2147483647(231-1)无符号长整型unsignedlong[int]404294967295(232-1)

2.3

变量2.3.1整型变量

知识库有符号整数将存储单元中最左侧的一位作为符号位,如果该位为0,表示数值为正;如果该位为1,表示数值为负。因此,最大的32位整数的二进制表示形式是01111111111111111111111111111111,对应的数值是2147483647(即231-1)。无符号整数,即不带符号位的整数(最左侧的位是数值的一部分)。所以最大的32位整数的二进制表示形式就是11111111111111111111111111111111,对应的数值是4294967295(即232-1)。

2.3

变量2.3.1整型变量例如,定义一个整型变量a,并为其赋值0的方法如下:inta; /*定义一个整型变量a*/a=5; /*为a赋值5*/用户也可定义变量的同时为变量赋初值,这种形式称为变量的初始化。例如:inta=10; /*定义一个整型变量a并初始化为10*/

提示表格中的[]为可选部分。例如[signed]int,在编写程序的时候可以用signedint表示有符号基本整型,也可以省略关键字signed,直接用int表示。

2.3

变量2.3.1整型变量

易错点拨编写程序时,定义变量的所有语句应放在程序的最前面,即在其他所有语句之前,否则会产生错误,例如:intc; /*定义一个整型变量c*/a=0; /*错误!!!因为赋值语句前没有定义变量a*/intb; /*定义变量b*/b=2; /*为变量b赋值*/

2.3

变量2.3.1整型变量【例2-2】#include<stdio.h>intmain(){ shorta,b; /*定义两个短整型变量a和b*/ a=32767; /*将值32767赋给变量a*/ b=a+1; /*将a的值加1后赋给变量b*/ printf("a=%d,b=%d\n",a,b); /*输出a和b的值*/ return0; /*函数返回值*/}有符号短整型数据的溢出。

2.3

变量2.3.1整型变量【运行结果】程序运行结果如图所示。

2.3

变量2.3.1整型变量【程序说明】我们定义的变量a和b都是有符号的短整型,其取值范围为-32768~32767,所以无法表示大于32767或者小于-32768的数,所以当a的值加1变成了32768后就发生了“溢出”。但运行时并不报错,它好像汽车里程表一样,达到最大值以后,又从最小值开始计数。所以32767加1后得到的结果不是32768,而是-32768。从这里可以看到:C语言的用法比较灵活,即使程序存在潜在问题,系统也不会给出“出错信息”,此时只能依靠程序员的经验来保证结果的正确。在这里,我们只需把变量b改成int型或者long型,就可以得到预期的结果了(32768)。

拓展阅读在使用整型常量时,可以在常量的后面加上字符L(l)或者U(u)进行修饰。L表示该常量为长整型,U表示该常量为无符号整型,例如:a=1256L; /*L表示长整型*/b=500U; /*U表示无符号整型*/

2.3

变量2.3.1整型变量整数类型并不适用于所有应用。有时需要变量能够存储带小数点的数,或者能够存储极大数或极小数。这类数可以用实型变量进行存储,实型变量也称为浮点型变量。实型变量根据精度可以分为单精度类型、双精度类型和长双精度类型等3种类型。具体的关键字表示和各类型的取值范围如表所示。类型名称关键字字节数精度取值范围(绝对值)单精度float46个数字0以及1.2×10-38~2.4×1038双精度double815个数字0以及2.3×10-308~1.7×10308长双精度longdouble815个数字0以及2.3×10-308~1.7×10308

2.3

变量2.3.2实型变量

拓展阅读C标准没有说明float、double和longdouble类型提供的数据精度到底是多少,因为不同的计算机可以用不同方法存储浮点数。大多数现代计算机都遵循IEEE754标准规范。数值以科学计数法的形式存储,每个数都由三部分组成:符号、指数和小数。其中,指数部分的位数决定了实数的大小,小数部分的位数决定了实数的精度。

2.3

变量2.3.2实型变量单精度类型1单精度类型使用关键字float来进行定义变量,它在内存中占4个字节,提供6位有效数字,取值范围为-2.4×1038~-1.2×10-38、0以及1.2×10-38~2.4×1038。例如,定义一个单精度型变量fx,并为其赋值为5.78的方法如下:floatfx; /*定义单精度变量fx*/fx=5.78F; /*为fx赋值5.78*/

2.3

变量2.3.2实型变量由于实型变量由有限的存储单元组成,能提供的有效数字总是有限的,在有效位以外的数字将无法正确处理,由此可能会产生一些误差,称为实型数据的舍入误差。上面提到了单精度有效数字为6位,超过6位将有可能无法正确显示。

提示默认状态下,实型常量为double双精度类型,如果要赋值给单精度类型的变量,可在常量后面加上符号F或者f。

2.3

变量2.3.2实型变量【例2-3】#include<stdio.h>intmain(){ floatf; /*定义单精度型变量f*/ f=1234567.90123; /*将值1234567.90123赋给变量f*/ printf("f=%f\n",f); /*输出变量f的值*/ return0; /*函数返回值0*/}单精度型数据的有效位。

2.3

变量2.3.2实型变量【运行结果】程序运行结果如图所示。【程序说明】由于float型只接受6-7位有效数字,因此显示的数据中只有前7位是保证正确的,后面的数据将无法正确处理,显示的是编译器随机给出的数。为了扩展有效数字范围,可使用double类型或longdouble类型。

2.3

变量2.3.2实型变量双精度类型2在C语言中,双精度型(double)是用于存储高精度浮点数的数据类型,相比float(单精度)具有更高的精度和更大的数值范围,其特点和使用规则如下:存储特性:通常占用8字节(64位)内存空间;遵循IEEE754标准,由1位符号位、11位指数位和52位尾数位组成;精度约为15-17位有效数字,数值范围约为

±1.7×10³⁰⁸。

2.3

变量2.3.2实型变量【例2-4】#include<stdio.h>intmain(){ doublef; /*定义双精度型变量f*/

f=1234567.90123; /*将值1234567.90123赋给变量f*/ printf("f=%f\n",f); /*输出变量f的值*/ return0; /*函数返回值0*/}将例2-3中的变量定义为double类型。

2.3

变量2.3.2实型变量【运行结果】运行结果如图所示。

2.3

变量2.3.2实型变量【程序说明】由于double型提供15-17位有效数字,所以输出的数据数值是正确的。

提示用格式输出函数printf输出实型时,输出格式采用%f,默认输出6位小数,不足6位补0,多于6位只保留6位,多余位数四舍五入,我们将在第4章中详细介绍。

2.3

变量2.3.2实型变量长双精度类型3在C语言中,长双精度类型(longdouble)是精度最高的浮点类型,用于需要极高精度的数值计算,其特性如下:1.存储与精度:标准未规定固定长度,通常占用8、10或16字节(不同编译器和系统有差异);精度普遍高于double,有效数字可达18-19位甚至更多;数值范围更大,可表示更小或更大的浮点数。2.使用要点:格式化输出需用%Lf占位符(注意大写L);兼容性较差,不同平台实现差异大;运算速度可能慢于float和double;仅在极高精度需求场景使用(如精密科学计算)。例如,定义一个长双精度型变量f,并为其赋值为15.08的方法如下:#include<stdio.h>intmain(){longdoublef;/*定义长双精度变量f*/f=15.08;/*为fl赋值15.08*/

printf("长双精度值:%Lf\n",f)

/*输出f的值*/

return0;}

2.3

变量2.3.2实型变量字符型变量定义的关键字为char,在内存中占一个字节。前面说过,字符型数据和整型数据可以互用,但是整型占4个字节,字符型只占1个字节,故当整型量按字符型量处理时,只有低八位参与处理。下面通过一个程序看一下字符型变量的定义与使用。【例2-5】#include<stdio.h>intmain(){charlow,up; /*定义字符变量low和up*/ low='a'; /*给变量low赋值'a'*/ up=low-32; /*low的值减去32后赋给变量upp*/ printf("low=%c,up=%c\n",low,up); /*以字符格式输出low和up*/ printf("low=%d,up=%d\n",low,up); /*以整数格式输出low和up*/ return0; /*函数返回值0*/}字符型变量的定义和使用。

2.3

变量2.3.3字符变量【运行结果】程序运行结果如图所示。【程序说明】用格式输出函数printf输出字符型数据时,输出格式为%c,此时输出显示字符。采用格式%d时,将输出字符对应的ASCII码的整型值。

2.3

变量2.3.3字符变量

录目录CONTENTS

C程序组成元素2.1

运算符和表达式2.4

常量2.2

变量2.3

数据类型转换2.5在C语言中运算量和运算符组成了表达式,而表达式是处理数据和执行各种操作的基本单位。运算量包括常量与变量,而C语言的运算符很多,大致可以分为以下几类:算术运算符:+-*/%++--关系运算符:><>=<===!=逻辑运算符:&&||!位运算符:&|~^<<>>条件运算符:?:赋值运算符:=+=-=*=/=%=&=|=^=>>=<<=逗号运算符:,指针运算符:*&

2.4

运算符和表达式32147658构造类型特殊运算符:.->下标运算符:[]圆括号运算符:()大括号运算符:{}求字节数运算符:sizeof类型转换运算符:(类型标识符)(表达式)其他:如函数调用运算符()本章只介绍算术运算符、赋值运算符、逗号运算符和位运算符,其他运算符将陆续在以后各章中介绍。

2.4

运算符和表达式1110912141315C语言的算术运算符包括两大类:一类是基本的算术运算符,包括2个单目算术运算符和5个双目算术运算符;另一类是自增和自减这两个特殊的运算符。下面对这两类运算符进行详细介绍。基本的算术运算符1基本算术运算符包括两个单目运算符(正和负),5个双目运算符(加、减、乘、除和模运算)。具体符号及其对应的功能举例如表所示。注意:/对整数运算时会截断小数;%仅用于整数。运算符功能举例结果+正号运算(单目运算符)+aa的值-负号运算(单目运算符)-aa的负数+加法运算a+ba和b的和-减法运算a-ba和b的差*乘法运算a*ba和b的积/除法运算a/ba除以b的商%模运算(求余运算)a%ba除以b的余数

2.4

运算符和表达式2.4.1算术运算符与算术表达式在表达式中使用算术运算符,则将表达式称为算术表达式。算术表达式的计算根据运算符的优先级从高到低依次执行。对于一个运算量两侧同优先级的运算符,按结合律方向进行。算术运算符的结合律皆为“左结合性”,即同优先级算术运算符按“自左向右”方向进行计算。例如,对于a+b-c,先计算a+b,再减c。运算符优先级:①括号()、数组下标[]、结构体成员访问.和->;②单目运算符(!、~、++、--、*、&、sizeof);③算术运算符(先*、/、%,后+、-);④位运算符(<<、>>);⑤关系运算符(<、>、<=、>=高于==、!=);⑥位运算符(&高于^高于|);⑦逻辑运算符(&&高于||);⑧条件运算符?:;⑨赋值运算符(=、+=等);⑩逗号运算符

提示1.由于键盘中没有×号和÷号,运算符用*和/代替。2.对于除法运算符/,如果是两个整数相除,则结果亦为整数,小数部分将被去掉,如7/2=3,而不是2.5。只有两数中有一个是浮点数,结果才为浮点数。3.模运算符%只适用于两个整数取余,其两个运算变量只能是整型或字符型(ASCII码),而不能是其他类型。其中,余数结果的符号由被除数决定,如8%(-3)=2,而(-8)%3=-2。

2.4

运算符和表达式2.4.1算术运算符与算术表达式自增运算符++及自减运算符--的作用是让变量的值加1或减1。但自增自减运算符都有前置与后置之分,前置后置决定了变量使用与计算(加1或减1)的顺序:自增自减运算符2自增运算符前置,如++i,是先将i的值加1,再使用加1后i的值。自增运算符后置,如i++,是先使用i当前的值,再将i的值加1。

2.4

运算符和表达式2.4.1算术运算符与算术表达式12自减运算符前置,如--i,是先将i的值减1,再使用减1后i的值。自减运算符后置,如i--,是先使用i当前的值,再将i的值减1。

提示自增自减运算符只能作用于单个变量,不能用于常量或表达式,例如,3++,(a+b)--都是不合法的。

2.4

运算符和表达式2.4.1算术运算符与算术表达式12【例2-6】#include<stdio.h>intmain(){ inta,b,c,d;

/*定义a,b,c,d四个整型变量*/ a=10;

/*a赋值为10*/ b=5;

/*b赋值为5*/ c=a++;

/*自增运算符后置,先将a的值赋给c,a再自加1*/ d=--b;

/*自减运算符前置,b先自减1,再将值赋给d*/ printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d); /*输出a,b,c,d的值*/ return0; /*函数返回值0*/}比较自增、自减运算符前置与后置的不同。

2.4

运算符和表达式2.4.1算术运算符与算术表达式【程序说明】实际上,程序中c=a++,可看作两步:先是计算c=a,所以c等于10;后计算a=a+1,所以a等于11。程序中的d=--b,亦可等价于先计算b=b-1,后计算d=b,所以b等于4,d也等于4。因此下面程序与例2-6的程序功能是等价的。【运行结果】程序运行结果如图所示。

2.4

运算符和表达式2.4.1算术运算符与算术表达式#include<stdio.h>intmain(){ inta,b,c,d; /*定义a,b,c,d四个整型变量*/ a=10; /*a赋值为10*/ b=5; /*b赋值为5*/ c=a; /*将a的值赋给c*/ a=a+1; /*a+1后的值赋给a*/ b=b-1; /*b-1后的值赋给b*/ d=b; /*b的值赋给d*/ printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d); /*输出a,b,c,d的值*/ return0; /*函数返回值0*/}

2.4

运算符和表达式2.4.1算术运算符与算术表达式自增自减运算符常用于循环语句中,使循环变量自动加1;也用于指针变量,使指针指向下一个地址。这些将在后面的章节中介绍。【运行结果】程序运行结果如图所示。

拓展阅读使用++和--运算符时,常常会出现一些人们想不到的副作用,如a+++b,是理解为(a++)+b,还是a+(++b)呢?为避免二义性,可以加上括号,如(a++)+b。

2.4

运算符和表达式2.4.1算术运算符与算术表达式=是最基本的赋值运算符,作用是将右边表达式的值赋给左边的变量。语法格式:变量=表达式;示例:inta,b,c;a=10;//将常量10赋给变量aa=(3+5)*2;//将表达式计算结果16赋给变量ab=a;//声明变量时同时赋值(初始化)c=b=a+3;//作用是先把a+3的值赋给b,最后赋给c注意:赋值运算符左边必须是可修改的左值(如变量),不能是常量或表达式;=与==不同,==是关系运算符(判断相等),不要混淆。简单赋值1

2.4

运算符和表达式2.4.2赋值运算符与赋值表达式

高手点拨在为变量赋初值时,如果要对几个变量赋予同一个初值,可以采用如下格式:inta,b,c;a=b=c=0;也可以写成:inta=0,b=0,c=0;但是不能写成:inta=b=c=0;

2.4

运算符和表达式2.4.2赋值运算符与赋值表达式

提示(a=b)=2-2;这条语句是错误的,因为(a=b)不是变量,而是表达式,赋值表达式中左侧必须是变量。下面我们列举一些赋值语句的例子以帮助我们理解:a=2+(b=3); /*表达式的值为5,a的值为5,b的值为3*/a=(b=4)+(c=2); /*表达式的值为6,a的值为6,b的值为4,c的值为2*/a=(b=5)/(c=2); /*表达式的值为2,a的值为2,b的值为5,c的值为2*/a=(b=2-2); /*将2-2的值先赋给b,然后把b的值赋给a,a和b的值都是1*/

2.4

运算符和表达式2.4.2赋值运算符与赋值表达式复合赋值运算符是将算术运算符或位运算符与赋值运算符结合,形成简化的赋值表达式。使用复合赋值运算符可以让代码更简洁。复合赋值2

2.4

运算符和表达式2.4.2赋值运算符与赋值表达式赋值运算符都为同一优先级,遵循“右结合性”,其结合方向为“自右向左”。

提示如果b是包含若干项的表达式,则相当于它有括号,例如:a*=b-3; /*相当于a=a*(b-3);*/

2.4

运算符和表达式2.4.2赋值运算符与赋值表达式示例:intx=10;x+=5;//等价于x=x+5;结果x=15x*=2;//等价于x=x*2;结果x=30x-=8;//等价于x=x-8;结果x=22x%=5;//等价于x=x%5;结果x=2(22除以5余数为2)【例2-7】#include<stdio.h>intmain(){inta=1; /*定义整型变量a,并将其赋值为1*/a*=a-=5; /*用复合赋值运算计算a的值*/printf("a=%d\n",a); /*输出a的值*/return0; /*函数返回值0*/}赋值运算的结合性。

2.4

运算符和表达式2.4.2赋值运算符与赋值表达式【程序说明】因为赋值运算符为右结合性,在表达式a*=a-=5中,故先计算a-=5,等价于a=a-5,则a变为-4;再计算a*=a,等价于a=(-4)*(-4),所以最后结果为a=16。【运行结果】程序运行结果如图所示。

2.4

运算符和表达式2.4.2赋值运算符与赋值表达式在C语言中,逗号运算符(,)是一种特殊的运算符,它允许将多个表达式组合成一个表达式(称为逗号表达式),并按顺序执行这些表达式。1.逗号表达式的基本形式逗号表达式的语法格式:表达式1,表达式2,...,表达式n执行规则:从左到右依次执行每个表达式,整个逗号表达式的值是最后一个表达式(表达式n)的值,逗号运算符的优先级是所有运算符中最低的。2.使用示例#include<stdio.h>intmain(){inta,b,c,//基本用法:依次执行,返回最后一个表达式的值

2.4

运算符和表达式2.4.3逗号运算符和逗号表达式a=(1+2,3*4,5-6);//a的值为-1(最后一个表达式5-6的结果)//结合赋值的使用b=10;c=(b++,b*2,b+5);//执行顺序:b++(b=11)→b*2(22)→b+5(16),c=16//在for循环中的典型应用for(inti=0,j=10;i<j;i++,j--){printf("i=%d,j=%d\n",i,j);}return0;}

2.4

运算符和表达式2.4.3逗号运算符和逗号表达式3.逗号运算符的应用场景简化代码:在允许单个表达式的地方执行多个操作intx;x=0;x++;x*=2;//可简化为x=(x=0,x++,x*=2);for循环控制:在循环初始化和迭代部分声明或修改多个变量for(inti=0,sum=0;i<=100;i++,sum+=i){...}函数参数:注意函数参数中的逗号是分隔符,不是逗号运算符printf("%d,%d",a,b);//这里的逗号是参数分隔符printf("%d",(a,b));//这里的逗号是运算符,输出b的值

2.4

运算符和表达式2.4.3逗号运算符和逗号表达式4.注意事项(1)逗号运算符优先级最低,必要时需用括号改变运算顺序intx=10,y=20;intresult=x+y,x*y;//错误!会被解析为(result=x+y),(x*y)intresult=(x+y,x*y);//正确,result的值为x*y的结果(2)避免过度使用逗号表达式,可能降低代码可读性(3)区分逗号作为运算符和分隔符的不同用法(函数参数、变量声明中的逗号是分隔符)逗号表达式为C语言提供了一种将多个操作组合在一起的方式,合理使用可以使代码更紧凑,但需注意其优先级和可读性问题。

2.4

运算符和表达式2.4.3逗号运算符和逗号表达式位运算是C语言中比较有特色的功能。所谓位运算是指进行二进制位的运算,例如将一个存储单元中的各二进制位左移或右移一位。位运算符包括按位与、按位或、按位异或、取反、左移和右移这6种,其中只有取反运算是单目运算,其余都是双目运算,且参与位运算的运算量只能是整型或字符型的数据,不能是实型数据。“按位与”运算符(&)1参与运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。即0&0=0,0&1=0,1&0=0,1&1=1。例如,2&3结果并不等于5,应该按位与,计算结果应为2,计算过程如下:

2.4

运算符和表达式2.4.4位运算符与位运算“按位或”运算符(|)2两个相应的二进制位中只要有一个为1,该位的结果值就为1。即0|0=0,0|1=1,1|0=1,1|1=1。例如,2|3的结果为3,计算过程如下:

2.4

运算符和表达式2.4.4位运算符与位运算“异或”运算符(^)3异或运算的规则是:如果参与运算的两个二进制位相同,则结果为0;不同则为1。即0^0=0,0^1=1,1^0=1,1^1=0。例如,2^3的值为1,计算过程如下:

2.4

运算符和表达式2.4.4位运算符与位运算“取反”运算符(~)4取反运算是一个单目运算符,用来对一个二进制数按位取反,即将0变为1,将1变为0。例如,~3(即二进制数为00000011)按位取反后为252(即二进制数为11111100)。左移运算符(<<)5左移运算用来将一个数的各二进制位全部左移若干位,高位左移溢出后舍弃。例如:a=a<<2,表示将a的二进制数左移2位,右补0。若a=3,即二进制数00000011,左移2位得00001100,结果为十进制数12。

2.4

运算符和表达式2.4.4位运算符与位运算右移运算符(>>)6右移运算用来将一个数的二进制位全部右移若干位,移到右端的低位被舍弃,对无符号数,高位补0。例如:a=a>>1,表示将a的二进制数右移1位,左补0。若a=3,即二进制数00000011,右移1位得00000001,即最低位的1被舍弃,得十进制数1。对于有符号数,在右移时,符号位将一同移动,当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。VisualC++6.0

温馨提示

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

评论

0/150

提交评论