《C语言的语法基础 (2).ppt》由会员分享,可在线阅读,更多相关《C语言的语法基础 (2).ppt(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2.1 基本数据类型基本数据类型2.2 基本输入、输出函数基本输入、输出函数2.3 运算符和表达式运算符和表达式第二章第二章 C C语言的语法基础语言的语法基础2.1 基本数据类型基本数据类型2.1.1 标识符与基本数据类型标识符与基本数据类型1.标识符(标识符(identifier)标识符是一个名字,在C语言中指常量、变量、类型、语句、标号及函数的名称。C语言标识符有三类:关键字、预定义标识符和用户定义标识符。(1)关键字(43个):已被C系统所使用的标识符。(2)预定义标识符:C系统提供的库函数名和编译预处理命令等(3)用户标识符:用户根据需要在程序中用到的变量、符号常数、用户函数、标号等
2、进行命名。命名规则:标识符只能由英文字母、下划线和数字组成,且只能由英文字母或下划线开头。标识符长度不能超过32个字符,且不能与关键字相同;应避免与预定义标识符相同;标识符区分大小写。2.基本数据类型(基本数据类型(basic data types)FC的基本数据类型如下:F在程序中对用到的所有数据类型都必须指定其数据类型。整型(int)字符型(char)实型(浮点型)枚举类型(enum)数组类型()结 构 体 类 型(struct)共用体类型(union)单 精 度 型(float)双精度型(double)指针类型(*)构造类型基本类型空类型(NULL)数据类型2.1.2 常量与变量常量与变
3、量F1.常量常量(constants)在程序运行过程中,其值不能被改变的量称为常量。C语言有整型常量、实型常量、字符型常量、字符串常量和符号常量5种。如12、0、-3为整型常量,4.6、-1.23为实型常量,a、d为字符常量,“abcd”、“12hhd”为字符串常量。用标识符代表的常量称为符号常量。如#define PRICE 30 (1)整型常量 C语言整型常数可用以下三种形式表示:十进制整型。不由0开头,由09组成,前面可加正负号;如123,-456,0。八进制整数。以0开头,只能由07组成,前面可加正负号。如0123表示八进制数123,即182+281+380,-011表示八进制-11,
4、即十进制-9 十六进制整数。以0 x(或X)开头,可以由09、字母a(或A)f(或F)组成,前面可加正负号。如0 x123等于十进制数的291。-0 x12等于十进制的-18。整型常数的类型:在一个整常数后加一字母u,则认为是无符号常数;在一个整常数后面加一个字母l或L,则认为是long int型常数。(2)实型常量 实数又称浮点数,有两种表示形式:(1)十进制小数形式。它是由数字和小数点组成(注意必须有小数点)。如.123、123.、0.0、123.0。(2)指数形式。如123e3或123E3。但字母e(或E)之前必须有数字,且e后面的指数必须为整数(不能为空)。如e3、2.1e3.5、.e
5、3、e等都不是合法的指数形式。在字母e(或E)之前的小数部分中。小数点左边应有1位(且只能有1位)非零的数字,称为“规范化的指数形式”。实型常数的类型 许多C编译系统将实型常数作为双精度(double,占8个字节)来处理。可以在带小数点的数的后面加字母f或F来指定实型常数为单精度(float,占4个字节),加字母l或L来指定实型常数为长双精度(long double,占10个字节)。(3)字符型常量 C的字符常数是用单引号括起来的字符。如a,x,A等。除了以上形式的字符常数外,C还允许用一种特殊形式的字符常数,就是以一个“”开头的字符系列,称为“转义字符”常用的以“”开头的特殊字符见下表:例如
6、:main()printf(“ab ctdeb101fgn”);printf(“ab crde12x41n”);运行结果:ab c dAfg de c A(4)字符串常数 字符常数是由一对单引号括起来的单个字符。字符串常数是一对双引号括起来的字符系列。如:“How do you do.”,“CHINA”,“a”,“$123.45”都是字符串常数。注意:字符常数a与字符串常数“a”是不同的,不能把“a”等字符串常数赋给一个字符变量。C规定:在每一个字符串的结尾加一个“字符串结束标志”即字符0,因此,字符串常数“a”在内存中是:字符串“a”实际上包含2个字符a和0,因而不能赋给只能容纳一个字符的字
7、符变量。C语言没有专门的字符串变量,解决办法是使用字符数组。A 0A 0(5)符号常数用标识符代表的常量称为符号常量。习惯用大写字母表示可以用两种方法定义符号常数:利用宏定义#define定义符号常数,如:#define PI 3.14159#define ESC 27#define ID“102343-3852396-y3v4x5a”利用“const”定义符号常数,格式为:const 数据类型关键字 符号常数1=常数1,符号常数2=常数2,如:const int MAXINT=32767;const long int MAXLONG=2147483647;F2.变量变量(variables)
8、其值可以改变的量称为变量。一个变量应该有一个名字即变量名,变量名只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。一个变量在内存中占有一定的存储空间,这个存储空间内所存放的数据就是变量的值。变量的类型确定了该变量的性质、取值范围、占内存空间的大小以及所能参加运算的方式。C语言区分大小写字母。变量名一般为长度8的小写字母。变量定义的格式如下:数据类型关键字 如:int i,j,k;Turbo C2.0基本数据类型关键字、所占内存字节数及取值范围F3.变量初始化变量初始化(variables initialization)动态变量未经初始化,也未赋值,其值是不确定的。C语言允许
9、:(1)先定义变量,再赋初值,如:float a,b,c;a=1.1;b=12.2;c=1.9;(或a=1.1,b=12.2,c=1.9;)(2)在定义变量的同时赋初值,如:int a=3;float f=3.56;char c=a;int a=3,b=3,c=3;(3)对被定义的变量一部分赋初值,如:int a,b,c=3;int a=3,b,c;2.1.3 内存的概念内存的概念 计算机内存是由一片连续的存储单元组成,操作系统给每个单元编号,这个编号称为内存单元的地址。地址通常由一组连续的整数组成,编号小的称为内存低地址,编号大的称为内存高地址。每个单元占1个字节,即内存中每个字节有一个地址
10、(编号)。如果定义了一个整型变量i:int i;i=10;i实际是占2个字节的一个内存地址名,这个地址中存放的内容是10。数据在内存中实际存放情况如下:如果数值是负的,则在内存中存放它的补码。如存放-10情况如下:10 0 0 0 0 0 0 00 0 0 0 1 00i有符号数的最高位表示符号位,符号位为0表示整数,符号位为1表示负数;无符号数表示的都是正数,其最高位不是符号位。如:内存中有二进制数1111 1111 1110 0111,把它看成是有符号整数时,其值为25;若把它视为无符号整数,则值为0 xffe7(即十进制65511)。字符变量的值即字符数据在内存中是以二进制形式存放字符的
11、ASCII码。如:内存中有二进制数0100 0001,把它看成是字符类型时,其值为A,把它视为int类型时,其值为65。字符型数据和整型数据是通用的,可以混用(注意:字符数据只占一个字节)。10 0 0 0 0 0 0 0 0 0 0 0 1 0010的原码01 1 1 1 1 1 1 1 1 1 1 1 0 11取反11 1 1 1 1 1 1 1 1 1 1 1 0 10 再加1得-10的补码*2.2 基本输入输出函数基本输入输出函数2.2.1 格式输入函数和格式输出函数格式输入函数和格式输出函数F1.1.printfprintf函数(格式输出函数)函数(格式输出函数)作用:向终端设备输出
12、若干个任意类型的数据。一般格式:printf(格式控制,输出列表)如:printf(“%d,%cn”,i,c)其中:“格式控制”是用双引号括起来的字符串,包括普通字符(需原样输出的字符)和格式说明(由“%”和格式字符(一般为小写)组成,用于将输出的数据转换为指定的格式输出。注意:格式说明与输出项从左到右的数据类型必须一一匹配,否 则将输出错误结果。如printf(“%d,%dn”,123,123.456);格式说明与输出项的个数必须相同。printf调用结束后返回一个函数值,其值等于输出项个数每一个格式说明都必须用开头,以一个格式字符作为结束,在此之间根据需要可以插入“宽度说明”、左对齐符号“
13、”、长度修饰符“l”和“L”等。不同类型的数据用不同的格式字符。常用的有以下几种:(1 1)d(d(或或i)i)格式符格式符:用于输出十进制整数(不能输出float或double)%d:按整型数据的实际长度输出。%md:用m指定输出字段的宽度,如果数据的实际位数小于m,则左端补空格(m为负时,右补空,下同),若大于m,则按实际位数输出。如printf(“%4d,%4d”,a,b)若a=123,b=12345,则输出为:123,12345%ld 或%Ld:输出长整型数据,也可用于输出int型数据(不能写成%dl)。可以指定输出宽度,如:long a=125790;printf(“%8ld”,a)
14、(2 2)o o格式符格式符:以八进制形式输出整数(“%o”),对长整型可以用“%lo”格式输出,同样可以指定输出宽度(“%mo”或“%mlo”)。实际上是将内存中的数据每3位一组按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制数的一部分输出。如:int a=-1;printf(“%d,%o”,a,a);输出为:-1,177777(3 3)x x(或(或X)X)格式符格式符:以十六进制形式输出整数(“%x”)。对长整型可以用“%lx”格式输出,同样可以指定输出宽度(“%mx”或“%mlx”)。实际上是将内存中的数据每4位一组按十六进制形式输出,因此输出的数值也不带符号,即将
15、符号位也一起作为十六进制数的一部分输出。如:int a=-1;printf(“%x,%o,%d”,a,a,a);输出为:ffff,177777,-1(4 4)u u格式符格式符:用于输出unsigned型数据(“%u”),即无符号数,以十进制形式输出,也可以“%mu”或“%mlu”。一个有符号整数也可以用%u格式输出;反之,一个 unsigned型数据也可以用%d格式输出。unsigned型数据也可以用%o或%x格式输出。如:main()unsigned int a=65535;int b=-2;printf(“a=%d,%o,%x,%un”,a,a,a,a);printf(“b=%d,%o,
16、%x,%un”,b,b,b,b);运行结果为:a=-1,177777,ffff,65535 b=-2,177776,fffe,65534(5 5)c c格式符格式符:用于输出一个字符(“%c”),可以指定输出宽度(“%mc”,m为正,字符前补空格,m为负,字符后补空格),也可以(“%mlc”无意义)。如果给定的输出值255,“则将低8位转换为字符输出。如:main()char c=a;int i=97;int j=97+256;printf(“%c,%dn”,c,c);printf(“%c,%dn”,i,i);printf(“%c,%dn”,j,j);运行结果为:a,97 a,97 a,353
17、(6 6)s s格式符格式符:用于输出一个字符串(“%s”),可以指定输出宽度(“%ms”,若m串长,串左补空格,m为负,串右补空格),也可以(“%m.ns”,输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的右侧,左补空格),还可以(“%-m.ns”,输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的左侧,右补空格)。如果nm,则m自动取n值,即保证n个字符正常输出;如果n串长,则按实际串输出。如:main()printf(“%3s,%7.2s,%.4s,%-5.3sn”,“CHINA”,“CHINA”,“CHINA”,“CHINA”);运行结果:CHINA,CH,C
18、HIN,CHI(7 7)f f格式符格式符:用于输出实数,以小数形式输出。%f:整数部分全部如数输出,并输出6位小数(注意有效位数);如:main()float x,y;x=111111.111;y=222222.222;printf(“%f,%f,%f”,x,y,x+y);运行结果为:111111.109375,222222.218750,333333.328125 如:main()double x,y;printf(“%f”,x+y);运行结果为:3333333333333.333010%mf:指定输出的数据占m列,其中有6位小数。如果数值长度小于m,则左端补空;如果数值长度(整数位+7)
19、大于m,则按实际输出(=8)。%m.nf:指定输出的数据占m列,其中有n位小数。如果数值长度小于m,则左端补空;如果数值长度(整数位+1+小数位n)大于m,则可能突破m列,输出宽度为整数位+1+小数位n。%-m.nf:与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。如:main()float f=123.456;printf(“%f%10f%10.2f%.2f%-10.2fn”,f,f,f,f,f);输出结果如下:123.456001 123.456001 123.46 123.46 123.46 (8 8)e(e(或或E)E)格式符格式符:以指数形式输出实数。%e:以13位宽度输
20、出,其中指数部分占5位,1位整数位,6位小数位和1为小数点位。如:printf(“%e”,123.456);输出:1.234560e+002%me:若m6),则左端补空。%-m.ne:与%m.ne基本相同,只是使输出的数值向左端靠,右端补空格。如:float f=123.456;printf(“%e%10e%10.2e%.2e%-10.2en”,f,f,f,f,f);输出结果如下:1.234560e+0021.234560e+0021.23e+0021.23e+0021.23e+002(9 9)g(g(或或G)G)格式符格式符:用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占
21、宽度较小的一种),且不输出无意义的零。如:float f=123.468;printf(“%f%e%g”,f,f,f);输出如下:123.4680001.234680e+002123.468(10)在数据前面的多余空格处填以数字0。如:printf(“%010d,%010.2fn”,-123,12345.678);运行结果:000000123,0012345.68(11)在输出的八进制数加前导0,对输出的十六进制数加前导0 x。如:printf(“%#o,%#xn”,65,65);运行结果:0101,0 x41 几点说明:l一个格式说明以“%”开头,以d,o,x,u,c,s,f,e,g等9个格
22、式字符之一为结束,中间可以插入附加格式字符l,L,m,n,-,.等;l如果想输出字符“%”,可在“格式控制”字符串中用连续两个%表示。l不同类型的数据应采用相应的格式字符输出,m只在实际长度小于m时才起作用,n一般都能得到执行。即首先考虑n的前提下,按实际长度输出,然后再考虑m,看是否要补空。F2.scanf2.scanf函数(格式输入函数)函数(格式输入函数)一般格式:scanf(格式控制,地址列表)如:main()int a,b,c;scanf(“%d%d%d”,&a,&b,&c);printf(“%d,%d,%dn”,a,b,c);运行时输入输出如下:3 4 5 3,4,5 其中“%d%
23、d%d”表示按十进制整数形式输入数据。输入数据时,两数据之间以一个或多个空格间隔,也可以回车键、跳格键tab。但不能用逗号分隔。scanf函数的格式说明与printf函数相似,以%开始,以一个格式字符结束,中间可插入附加字符。如下表所示:说明:(1)对于整数而言,scanf函数先将用户的输入数字暂存在内存,然后按“格式字符”的要求读取数据。若用户输入的数字不合法,则停止读取。(2)可以指定输入数据所占列数,系统自动按它截取所需数据。如:scanf(%3d%3d”,&a,&b)输入:123456,则a=123,b=456,等价于输入123 456 又如:scanf(“%3c%d”,&ch,&a)
24、前3个字符(包括空格或回车)为ch的输入,取第一个字符赋给ch,第4个之后的非空输入为a的输入。(3)如果在%后有一个“*”,表示跳过它指定的列数。如:scanf(“%2d%*3d%2d”,&a,&b);输入:12 345 76 则a=12,b=76(4)输入数据时不能规定精度。如:scanf(%7.2f”,&a)是不合法的(5)如果在“格式控制”字符串中除了格式说明外还有其他字符,则在输入数据时,应输入与这些字符相同的字符。如:scanf(“%d,%d”,&a,&b)应输入:3,4 scanf(“%d%d”,&a,&b)则两数之间应输入1个或更多个空格 scanf(“%c%c%c”,&a,&
25、b,&c)须连续输入3个字符,不须空格分隔(6)在输入数据时,遇到以下情况时该数据认为结束。遇空格或回车或Tab键 按指定宽度结束,如“%3d”遇非法输入2.2.2 非格式输入、输出函数非格式输入、输出函数FC语言本身不提供输入输出语句,输入输出操作是由函数来实现。如printf函数和scanf函数是由C标准函数库提供,因此,在使用这些函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中,如:#include /直接找C语言系统目录或#include“stdio.h”/先找工作目录,再找C语言系统目录 C语言不提供输入输出语句的目的是避免编译系统在编译阶段处理与硬件有
26、关的问题,可以使编译系统简化,通用性强,可移植性好。C语言函数库中提供了一批“标准输入输出函数”,它们是以标准的输入输出设备为输入输出对象的。如有:putchar(),getchar(),printf(),scanf(),puts(),gets()等。1.putchar函数(字符输出函数)函数(字符输出函数)作用:向终端输出一个字符;其一般形式为:putchar(int或char)如果所给的参数不是int或char,则先类型转换为int,再按字符输出,不给参数,则出错。如:#include main()char a,b,c;a=B;b=O;c=Y;putchar(a);putchar(b);p
27、utchar(c);运行结果为:BOY/*/putchar也可以用来输出控制字符如putchar(n),也可输出其他转义字符如putchar(101),putchar(),putchar(015)等。2.getchar函数(字符输入函数)函数(字符输入函数)作用:从终端输入一个字符;其一般形式为:getchar()函数不带参数(加参数则警告错),函数的值就是从输入设备得到的字符。如:#include main()char c;c=getchar();putchar(c);运行结果为:也可以:putchar(getchar(),或printf(“%c”,getchar()。F3.getch()3
28、.getch()和和getche()getche()函数函数 作用:从标准输入设备上读入一个字符,其调用形式为:getch();/*读入的字符不回显在屏幕上*/getche();/*读入的字符回显到屏幕上*/与getchar函数不同之处在于:getch和getche函数不必输入回车才结束,只要输入一个字符,该字符立即被接收,程序继续执行下一条语句。2.3 运算符和表达式运算符和表达式FC的运算符有以下几类:(1)算术运算符 (+-*/%)(2)关系运算符 (=!=)(3)逻辑运算符 (!&|)(4)位运算符 (|&)(5)赋值运算符 (=及其扩展赋值运算符)(6)条件运算符 (?:)(7)逗号
29、运算符 (,)(8)指针运算符 (*和&)(9)求字节数运算符 (sizeof)(10)强制类型转换运算符 (类型)(11)分量运算符 (.-)(12)下标运算符 ()(13)其他 (如函数调用运算符()2.3.1 算术运算算术运算1.算术运算符和算术表达式算术运算符和算术表达式 基本的算术运算符有:+(加法运算符,或正值运算符。如3+5、+3)(减法运算符,或负值运算符。如3-5、-3)*(乘法运算符。如3*5)/(除法运算符。如5/3=1,整数相除结果为整数,舍弃小数部分)%(模运算符或求余运算符,%两侧应为整型数,如7%4=3,余数的正负 号与被除数一致)用算术运算符和括号将运算对象(也
30、称操作数)连接起来的、符合C语法规则的式子,称为C算术表达式。运算对象包括常数、变量、函数等。C语言规定了运算符的优先级和结合性,在表达式求值时,先按运算符的优先级别高低次序执行,如果一个运算对象的两侧的运算符优先级别相同,则按规定的结合方向处理,遵循尽可能多地自左而右将若干个字符组成一个运算符原则。如:a-b*c 对操作数b而言,左为减号,右为乘号,而乘号优先于减号,因此,表达式相当于a-(b*c)。a-b+c 对操作数b而言,左为减号,右为加号,优先级别相同,因此,要按结合方向处理。算术运算符的结合方向是“自左至右”,因此,b先与减号结合,执行a-b的运算,再执行加c的运算。表达式相当于(
31、a-b)+c。-i+对操作数i而言,左为负号运算符,右为+运算符,优先级别相同,要按结合方向处理。两者的结合方向都是“自右至左”,因此,i先与+结合,执行i+的运算,再执行负号运算。表达式相当于-(i+)。(优先级别相同而结合方向不同的情况不存在)i+j 这不是一个操作数面对2个运算符的问题,它的执行顺序,遵循尽可能多地自左而右将若干个字符组成一个运算符原则,表达式相当于(i+)+j。(见附录E )2.各类数值型数据的混合运算各类数值型数据的混合运算 整型、实型、字符型数据间可以混合运算。如:10+a+1.5-8765.1234*b 是合法的。运算时,系统自动将不同类型的数据转换成同一类型,然
32、后进行运算。转换规则是级别低的向级别高的类型转换,如下图所示:同为signed或unsigned时按右图转换类型相同时,signed转换成unsigned 类型不同时,char和short无条件转换 为int,long,float,double;int,long无条 件转换为float,double;int,long仍遵循 signed转换成unsigned doubledoubleintintunsignedunsignedlonglongfloatfloatchar,shortchar,short高高低低2.3.2 强制类型转换强制类型转换一般形式为:(类型名)(表达式)如:(double
33、)a (int)(x+y)(float)(5%3)注意:在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。如:main()float x;int i;x=3.6;i=(int)x;/*i等于x的整数部分,而x的值和类型不变,仍为float型*/printf(“x=%f,i=%d”,x,i);/*运行结果为:x=3.600000,i=3*/2.3.3 增增1与减与减1运算运算F作用是使变量的值增1或减1,如:+i,-i (在使用i之前,先使i的值加(减)1)i+,i-(在使用i之后,使i的值加(减)1)如:j=+i (i的值先变成4,再赋给j,j的值为4)j=i+(先将i的
34、值3赋给j,j的值为3,然后i变为4)又如:i=3;printf(“%d”,+i);/*输出4*/i=3;printf(“%d”,i+);/*输出3*/i=3;printf(“%d”,-i+);/*输出-3*/注意:(1)自增运算符(+)和自减运算符(-),只能用于变量,不能用于常量或表达式,如5+或(a+b)+都不对。(2)对不同的系统,对表达式的求值顺序和函数参数的的求值顺序的处理不尽相同,应该尽量避免使用。如有如下表达式:I=3;j=(I+)+(I+)+(I+);/*j=12还是9*/Turbo C和MS C把3作为表达式中所有I的值,因此3个I相加,得到表达式的值为9,再实现自加3次,
35、I的值变为6。又如:I=3;printf(“%d,%d”,I,I+);对于这种情况,如果从左至右求值,则输出“3,3”。多数系统采用自右向左的方法,即先求I+,输出3后I变成4,再求第一个表达式I,输出4。2.3.4 赋值运算赋值运算(1)赋值运算符赋值运算符:“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如果赋值运算符两侧的类型不一致,但都是数值型或字符型,在赋值时要进行类型转换。规则如下:实型整型变量,舍弃实数的小数部分,超范围则溢出。整型实型变量,数值不变,用小数补足有效位。doublefloat变量,截取前面7位有效数字,超范围则溢出.floatdouble变量,数值不变,有
36、效位扩展到16位。unsigned charint变量,数值(ASCII)不变。signed charint变量,高8位符号扩展。int,short,long char变量,截取低8位。signed intlong变量,高8位符号扩展。unsigned intlong变量,高8位补0,数值不变。signedunsigned或unsignedsigned且长度相等,照搬 概括如下:赋值符号两侧类型长度相等,原样照搬。有(或无)符号短类型数据有(或无)符号长类型变量,数值不变,正值高位补0,负值符号扩展。有(或无)符号长类型数据有(或无)符号短类型变量,截取低位。(2 2)复合的赋值运算符)复合的
37、赋值运算符:赋值运算符之前加上其他运算符,可以构成复合运算符,如:a+=3 等价于a=a+3 x*=y+8 等价于x=x*(y+8)x%=3 等价于x=x%3 注意:运算符的左边只能是一个变量,右边可以是表达式。凡是二元(二目)运算符都可以与=组成复合赋值符,C语言规定可以使用10种复合运算符。即:+=,-=,*=,/=,%=,=,&=,=,|=(3 3)赋值表达式)赋值表达式:由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。它的一般形式为:如“a=5”是一个赋值表达式,赋值表达式的值就是被赋值的变量的值5(变量a的值也是5)。又如:a=b=c=5 (表达式的值为5,a、b、c
38、的值均为5)a=5+(c=6)(表达式的值为11,a为11,c为6)a=(b=4)+(c=6)(表达式的值为10,a为10,b为4,c为6)a=(b=10)/(c=2)(表达式的值为5,a为5,b为10,c为2)a+=a-=a*a (若a的初值为12,则赋值表达式值为-264)2.3.5 逗号运算逗号运算 F逗号表达式的一般形式为:表达式1,表达式2,表达式n 求解过程是:先求解表达式1,再求解表达式2,最后求解表达式n的值,整个逗号表达式的值是表达式n的值。如:3+5,6+8 逗号表达式的值为14 a=3*5,a*4 由于“=”优先级别高于“,”故先计算“a=3*5”得a的值为15,然后求解
39、a*4得60,表达式的值为60 注意:并不是任何地方出现的逗号都是作为逗号运算符。如:printf(“%d,%d,%d”,a,b,c);2.3.6 位运算位运算c语言具有高级语言的特点,又具有低级语言的功能,用途广泛。语言具有高级语言的特点,又具有低级语言的功能,用途广泛。位运算:就是对存储单元中的二进制位进行左、右移位,按位与、位运算:就是对存储单元中的二进制位进行左、右移位,按位与、或、异或、取反等操作。或、异或、取反等操作。注意:参加位运算的运算量只能是整型或字符型数据。注意:参加位运算的运算量只能是整型或字符型数据。1.“按位与按位与”运算符运算符(&)特点:两对应位都为特点:两对应位
40、都为1时结果为时结果为1,否则为,否则为0,例例3&5:3的补码:的补码:00000011 (&)5的补码:的补码:00000101 00000001 按位与可以用于取一个数的某些指定位(如按位与可以用于取一个数的某些指定位(如a&0377)。)。/*2.按位或运算符按位或运算符(|)特点:两对应位中只有一个为特点:两对应位中只有一个为1,结果便为,结果便为1,否则为,否则为0 例:例:3的补码:的补码:00000011 (|)5的补码:的补码:00000101 00000111 按位或可以用于对一个数的某些指定位置按位或可以用于对一个数的某些指定位置1(如:(如:a|0377)。)。3.“异
41、或异或”运算符运算符 ()特点:两对应位相同,结果便为特点:两对应位相同,结果便为0,否则为,否则为1 例:例:3的补码:的补码:00000011 ()5的补码:的补码:00000101 00000110 应用:(1)使特定位翻转 如:使01111010低4位翻转 01111010 ()00001111 01110101(2)与0相异或,保留原值(3)交换两个值,不用临时变量 如:a3,b4,则可以通过以下赋值语句将a和b的值互换。a=ab;b=ab;a=ab;a=011 ()b=100 a=111 ()b=100 b=011 ()a=111 a=1004.“取反取反”运算符运算符 ()特点:
42、是单目运算符,当某位原为特点:是单目运算符,当某位原为0 时,经反运算后为时,经反运算后为1,某,某位原为位原为1时,反运算后为时,反运算后为0;例例3:3的补码:的补码:00000011 11111100 又如要使又如要使a的最低位变成的最低位变成0,可以使用,可以使用aa&15.左移运算符左移运算符 ()特点:将数的二进制位全部左移若干位特点:将数的二进制位全部左移若干位 例:例:a=a)特点:将数的二进制位全部右移若干位特点:将数的二进制位全部右移若干位 例:例:b=b 2 将将b的值右移两位的值右移两位 若若b=00111000=56(10)右移两位:右移两位:00001110=14(
43、10)由此可见,右移一位除由此可见,右移一位除2,右移,右移2位相当除位相当除4 如果是正数或无符号数,则移入最高位的是如果是正数或无符号数,则移入最高位的是0,若是有符号的负,若是有符号的负数,有的系统数,有的系统最高位移入最高位移入0称逻辑右移,有的系统(称逻辑右移,有的系统(TC)最高位)最高位移入移入1称算术右移。称算术右移。7.位运算赋值运算符位运算赋值运算符&=|=如:如:a&=b(即即a=a&b)a=2(即即a=a2)8.不同长度的数据进行位运算不同长度的数据进行位运算 如:如:long a;int b;当进行:当进行:a&b 运算时,系统自动将二者按运算时,系统自动将二者按右端
44、对齐,变量右端对齐,变量b的左的左16位补位补0,若,若b为负数,左端补为负数,左端补16位位1,如果,如果b为无符号的数,则左边也补为无符号的数,则左边也补16位位0.2.3.7 关系、逻辑及条件运算关系、逻辑及条件运算1.关系运算关系运算 C语言提供6种关系运算符(结合方向:自左向右):=!=另外:关系运算符的优先级低于算术运算符 关系运算符的优先级高于赋值运算符 如:ca+b等效于c(a+b);ab=c等效于(ab)=c a=bc等效于a=(bc 等效于 a=(bc)优先级别相同(低)优先级别相同(低)优先级别相同(高)优先级别相同(高)用关系运算符将两个表达式(可以是算术表达式或关系表
45、达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式。如:ab,a+bb+c,(a=3)(b=5),ab)(bb 为真即1 ab)=c 表达式的值为1 d=ab d的值为1 f=abc f的值为02.逻辑运算逻辑运算C语言提供3种逻辑运算符:&逻辑与(结合方向:自左向右)|逻辑或(结合方向:自左向右)!逻辑非(结合方向:自右向左)优先次序:如:ab&xy等价于(ab)&(xy)a=b|x=y等价于(a=b)|(x=y)!a|ab 等价于(!a)|(ab)!(!(非非)(高(高)算术运算符算术运算符关系运算符关系运算符&(&(与与)|(|(或或)赋值运算符赋值运算符 (低低)
46、用逻辑运算符将关系表达式或逻辑量连接起来的式子,就是逻辑表达式。逻辑表达式的值是一个逻辑量,C语言编译系统在给出逻辑(或关系)运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。例如:(1)若a=4,则!a的值为0 (2)若a=4,b=5,则a&b的值为1 (3)a|b的值为1 (4)!a|b的值为1 (5)4&0|2的值为1 (6)53&8b)&(n=cd)m值变为0,n的值保持不变仍为1。再如:a=0,b=1;c=a+&b+;/*a=1,b=1,c=0*/d=a+|b+;/*a=2,b=1,d=1*/3.条件运算符条件运算符 一般
47、形式如下:表达式1?表达式2:表达式3 说明:(1)先求解表达式1的值,若为非0则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0,则求解表达式3,表达式3的值就是整个表达式的值。如:max=(ab)?a:b (2)条件运算符的优先级别高于逗号运算符和赋值运算符,处于倒数第三,且是唯一的三目运算符。其结合方向为“自右向左”。ab?a:cd?c:d 相当于 ab?a:(cd?c:d)(3)条件表达式不能取代一般的if语句;条件表达式中的表达式2和表达式3的类型可以不同,整个条件表达式的值的类型为两者中较高的类型。如表达式 xy?1:1.5的值为一实型数。2.3.8 长度运算符长度运算符 长度运算符“sizeof()”用于计算变量或类型所占内存字节数的大小,其用法为:sizeof(数据类型)计算该数据类型在内存中所占的字节数 sizeof(变量名)计算该变量在内存中所占的字节数