C语言新教材PPT课堂课件-第3章基本数据类型与表达式.ppt
第3章数据类型、运算符与表达式 3.1 C语言的数据类型语言的数据类型C数据类型丰富,分为:基本类型构造类型指针类型空类型整型字符型实型单精度双精度数组结构体共用体数据有常量、变量之分,均为其中一种类型。枚举数据类型在程序中对用到的所有数据都必须指定其数据类型。3.2 常量与变量常量与变量3.2.1 常量与符号常量常量与符号常量 C语言的数据有常量和变量之分。语言的数据有常量和变量之分。常量常量 程序运行过程中不能被改变的量。程序运行过程中不能被改变的量。如程序中:20、-5 整型常量 15.8、1.2 实型常量 a 字符常量常量一般从字面形式既可判断。这种常量称为直接常量或字面常量。例:#define PRICE 30 main()int num,total;num=10;total=num*PRICE;printf(total=%d,total);还可用一个标识符表示一个常量 符号常量符号常量(一般用大写,以区分变量)习惯上,符号常量名用大写,变量名用小写,以示区别。使用符号常量的好处是:(1)含义清楚;(2)在需要改变一个常量时能做到“一改全改”。#define PRICE 303.2.2 变量变量变量变量 在程序运行过程中,其值可以改变的量。在程序运行过程中,其值可以改变的量。一个变量应该有一个名字,在内存中占据一定的一个变量应该有一个名字,在内存中占据一定的存储单元。在该存储单元中存放变量的值。(存储单元。在该存储单元中存放变量的值。(注意注意区分变量名和变量值这两个不同的概念区分变量名和变量值这两个不同的概念),),变量名变量名 实际上是一个符号地址,在对程序编译连接时由系实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。地址,从其存储单元中读取数据。用来标识变量名、符号常量名、函数名、数组名、用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为类型名、文件名的有效字符序列称为标识符标识符。简单。简单地说,标识符就是一个名字。地说,标识符就是一个名字。C语言规定标识符只能由语言规定标识符只能由字母、数字和下划线字母、数字和下划线三种字符组成,三种字符组成,且第一个字符必须为字母或下划且第一个字符必须为字母或下划线。线。下面列出的是合法的标识符,也是合法的变量名:下面列出的是合法的标识符,也是合法的变量名:sum,_total,month,_123,BASIC;下面是不合法的标识符和变量名:下面是不合法的标识符和变量名:M.D.John,#123,3D64,ab注意:在注意:在C语言中,大写字母和小写字母被认为是语言中,大写字母和小写字母被认为是两个不同的字符。因此,两个不同的字符。因此,sum和和SUM是两个不同是两个不同的变量名。一般,变量名用小写字母表示。同时,的变量名。一般,变量名用小写字母表示。同时,在在C语言中,关键字不能作为标识符合变量名的。语言中,关键字不能作为标识符合变量名的。也不能和用户编制的函数或也不能和用户编制的函数或C C语言库函数同名。语言库函数同名。在在C语言中,要求所有变量都要语言中,要求所有变量都要“先定义,后使先定义,后使 用用”,这样做的目的是:,这样做的目的是:(1)凡未被事先定义的,不作为变量名,这就能保证凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用的正确。程序中变量名使用的正确。(2)每一个变量被指定为一确定类型,在编译时就能每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。为其分配相应的存储单元。(3)指定每一变量属于一个类型,这就便于在编译时,指定每一变量属于一个类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。据此检查该变量所进行的运算是否合法。例例:int a,b;a%b 可以得到可以得到a除以除以b的余数,如果将的余数,如果将a和和b定义成定义成实型变量,就不能进行求余运算。实型变量,就不能进行求余运算。3.3 整型数据整型数据 整型常量即整常数。整型常量即整常数。C语言整型常量可以写成十进制、语言整型常量可以写成十进制、八进制、十六进制三种形式。具体形式如下:八进制、十六进制三种形式。具体形式如下:(1)十进制整数。如:十进制整数。如:123,-456,0。(2)八进制整数。以数字八进制整数。以数字0开头的数是八进制数。如开头的数是八进制数。如0123表示八进制数表示八进制数123,其等于十进制数,其等于十进制数83。(3)十六进制整数。以十六进制整数。以0 x开头的数是十六进制数。如开头的数是十六进制数。如0 x123,代表十六进制数,代表十六进制数123,即等于十进制数,即等于十进制数291。3.3.1 整型常量的表示方法整型常量的表示方法1.整型数据在内存中的存放形式整型数据在内存中的存放形式 大家都知道,数据在内存中是以二进制形式来存放的,那么如何来存放一个整型变量呢?一个整型变量在计算机内存中占两个字节,以补码的形式来存放的,占十六位。3.3.2 整型变量整型变量2.整型变量的分类整型变量的分类 整型变量的基本类型符为int。根据数值的范围将变量定义为基本整型、短整型和长整型三种。如下表示:1.基本整型:用“int”表示2.短整型:用“short int”或“short”表示3.长整型:用“long”或“long int”表示 在C语言中,一个int型变量的值的范围 ,即3276832767,但有的变量的值却是正的,因此在C中,可以将变量定义为“无符号”类型,用修饰符unsigned。有符号用signed修饰符,如果不指定为unsigned,则默认为signed型。因此,加上有符号和无符号,整型变量就有6种形式,其如下所示:有符号基本整型 int 无符号基本整型 unsigned int 有符号短整型 short int 无符号短整型 unsigned short int 有符号长整型 long int 无符号长整型 unsigned long int 对于这6种整型变量,在计算机内存中,所占用的内存空间不一样,下面是这6种所占的位数。表2.1 Turbo C所支持的整型数据类型关键字关键字所占位数所占位数最小取值范围最小取值范围int16-3276832767unsigned int16065535unsigned short int16065535signed short int16同同 intlong int 32-21474836482147483647unsigned long int32042949672953.整型变量的定义整型变量的定义 例:整型变量的定义和使用。main()int a,b,c,d;/*a,b,c,d为整型变量*/unsigned u;/*u为无符号整型*/a=12;b=-24;u=10;c=a+u;d=b+u;printf(“a+u=%d,b+u=%dn”,c,d);程序运行结果为:a+u=22,b+u=-143.4 实型数据实型数据 实数又称为浮点数。实数有两种表示形式:(1)十进制小数形式。它由数字和小数点组成(注意必须有小数点)。如:0.123,1.23,12.3等。(2)指数形式。如123e3或123E3,都是123000。但注意字母e(或E)之前必须有数字,且e后面的指数必须为整数。一个实数可以有多种指数表示形式,因此规定了规范化的指数形式,即在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。如:1.23e3。一个实数在用指数形式输出时,是按规范化的指数形式输出的。3.4.1 实型常量的表示方法实型常量的表示方法1.实型变量的分类实型变量的分类 C实型变量可以分为单精度(实型变量可以分为单精度(float)型、双精度()型、双精度(double)型和长双精度(型和长双精度(long double)型三种。)型三种。3.4.2 实型变量实型变量类型所占位数有效数字数值范围float3267P46double641516同上long double1281819同上 2.实型数据的舍入误差实型数据的舍入误差 由于实型变量是用有限的存储单元存储的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。如下面的例子。例:实型数据的舍入误差。main()float a,b;/*定义a和b为单精度型的*/a=123456.789e5;b=a+20;printf(“%f,b);结果a和b的值都相等。3.5 字符型数据字符型数据 C语言的字符常量是用单撇号括起来的一个字符。如x,+,n,101都是合法的字符常量。注意,a和A是不同的字符常量。字符数据在内存中是以ASCII码存储,它的存储形式与整数的存储形式类似。因此可以通用。除了以上形式的字符常量外,C还允许用一种特殊形式的字符常量,就是以一个“”开头的字符序列。例如,在前面遇到过的n,它代表一个“换行”符。这是一种“控制字符”,在屏幕上是不能显示的。在程序中也无法用一个一般形式的字符表示,只能采用特殊形式来表示。3.5.1 字符常量字符常量常用的以开头的特殊字符如表2.3所示。字符形式字符形式功功 能能n换行换行t横向跳格(跳到下一个输出区)横向跳格(跳到下一个输出区)v竖向跳格竖向跳格b退格,将当前位置移到前一列退格,将当前位置移到前一列r回车,将当前位置移到本行开头回车,将当前位置移到本行开头f走纸换页,将当前位置移到下页开头走纸换页,将当前位置移到下页开头反斜杠字符反斜杠字符“”单引号字符单引号字符双引号字符双引号字符a报警报警0空值空值ddd1到到3位位8进制数所代表的字符进制数所代表的字符xhh1到到2位位16进制数所代表的字符进制数所代表的字符例:转义字符的使用例:转义字符的使用 main()printf(“_ab_ct_derftgn”);printf(“htibbj_k”);字符型变量用来存放字符常量,请注意只能放一个字符,不要以为在一个字符变量中可以放一个字符串(包括若干个字符)。字符变量的定义形式如下:char c1,c2;它表示c1和c2为字符型变量,各可以放一个自符,因此在本函数中可以用下面语句对c1、c2赋值:c1=a;c2=b;在所有的编译系统中都规定以一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。3.5.2 字符变量字符变量 将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。例如字符a的ASCII代码为97,b为98,在内存中是将97,98的二进制数存放到内存。字符数据以ASCII码存储,它的存储形式就与整型的存储形式类似。这样是字符数据和整型数据之间可以通用。一个字符数据既可以以字符形式输出,也可以以整型形式输出。以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后输出。以整数形式输出时,直接将ASCII码作为整数输出。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。3.5.3 字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法 例:向字符变量赋以整数。main()char c1,c2;/*c1,c2为字符变量*/c1=97;c2=98;printf(“%c%cn”,c1,c2);/*%c是字符输出的格式*/printf(“%d%dn”,c1,c2);输出结果:a b 97 98例:大小写字母的转换例:大小写字母的转换 main()char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(“%c%c”,c1,c2);输出结果:输出结果:A B 字符常量是由一对单撇号括起来的单个字符。C语言除了允许使用字符常量外,还允许使用字符串常量。字符串常量是一对双撇号括起来的字符序列。如:“How do you do.”,“CHINA”,“a”,“$123.45”等。都是字符常量。可以输出一个字符串,如:printf(“How do you do.”);不要将字符常量与字符串常量混淆。a是字符常量,而“a”是字符串常量,二者是不相同的。例:char c;c=a;是正确的 c=“a”;不正确 因为不能把一个字符串赋给一个字符变量。3.5.4 字符串常量字符串常量字符常量与字符串的区别:(1)字符常量在内存中占一个字节,而字符串不)字符常量在内存中占一个字节,而字符串不是;是;(2)C规定:在每一个字符串的结尾加一个规定:在每一个字符串的结尾加一个“字符字符串结束标志串结束标志”,以便系统据此判断字符串是否结,以便系统据此判断字符串是否结束。束。C语言以语言以0作为字符串结束标志。即是作为字符串结束标志。即是一个一个“空操作字符空操作字符”。注意:在写字符串时不必加注意:在写字符串时不必加0,系统会自动,系统会自动加上的。因此,字符串加上的。因此,字符串“a”,它在内存中实际上,它在内存中实际上是包含是包含2个字符:个字符:a和和0。在在C语言中可以用字符型数组来存放字符串。语言中可以用字符型数组来存放字符串。3.6 变量赋初值变量赋初值 程序中常需要对一些变量预先设置初值。C语言允许在定义变量的同时使变量初始化。如:int a=3;float f=4.56;char c=a;也可以使被定义的变量的一部分赋初值。如:int a,b,c=5;这表示指定a、b、c为整型变量,只对c初始化,c的值为5。如果对几个变量赋予初值都为3,应写成:int a=3,b=3,c=3;而不能写成:int a=b=c=3;对于定义 int a=3;相当于:int a;a=3;C语言允许双精度、单精度、整型及字符数据之间混合运算 10+a+1.58765.1234 b是允许的。但有一个规则:先转换成同一类型,再计算。3.7 各类数值型数据间的混合运算各类数值型数据间的混合运算 图中“”表示必定转换。如:char型和short型转化为int型,float型double型,然后进行运算。double float高低转换方法:longunsignedint char,short 图中“”:表示当运算对象为不同类型时转换的方向。如:int型与double型运算时要将int 型double型进行运算。其中:i int f float d double e long例:求10+a+if d/e运算结果的类型 10+a:转为int,结果为int if:转为double,结果为double+:转为double d/e:转为double 转为double则运算时则运算时:3.8 算术运算符与算术表达式算术运算符与算术表达式C语言的运算符归纳如下:语言的运算符归纳如下:(1)算术运算符算术运算符 (+-*/%)(2)关系运算符关系运算符 (=!=)(3)逻辑运算符逻辑运算符 (!&)(4)位运算符位运算符 (|&)(5)赋值运算符赋值运算符 (=及其扩展赋值运算符及其扩展赋值运算符)(6)条件运算符条件运算符 (?:)(7)逗号运算符逗号运算符 (,)(8)指针运算符指针运算符 (*和和&)(9)求字节数运算符求字节数运算符 (sizeof)(10)强制类型转换运算符强制类型转换运算符(类型类型)(11)分量运算符分量运算符 (.和和-)(12)下标运算符下标运算符 ()(13)其他其他 (如函数调用运算符如函数调用运算符()3.8.1 C运算符简介1.基本的算术运算符基本的算术运算符 C语言基本的算术运算符共有语言基本的算术运算符共有5种:种:+、-、*、/、%它们都是双目运算符,即运算符要求有两个操作数。如:它们都是双目运算符,即运算符要求有两个操作数。如:x+y、x-y、x*y、x/y、x%y都采用双目运算。都采用双目运算。注意:注意:(1)要求要求%运算左右两数必须为整型数据,如运算左右两数必须为整型数据,如7%4的值为的值为3。(2)两个整数相除,结果为整数,舍去小数部分。但是,如果除两个整数相除,结果为整数,舍去小数部分。但是,如果除数或被除数中有一个为负值,则舍入的方向是不固定的。如数或被除数中有一个为负值,则舍入的方向是不固定的。如5/3=1,但但-5/3在有的机器上得到的结果是在有的机器上得到的结果是-1,有的机器则是有的机器则是-2。多数机器采取多数机器采取“向零取整向零取整”的方法,即取整后向零靠拢(即的方法,即取整后向零靠拢(即向实数轴的原点靠拢)。向实数轴的原点靠拢)。(3)字符型数据可以和数值型数据混合运算。因为字符型数据在字符型数据可以和数值型数据混合运算。因为字符型数据在计算机内部是用一个字节的整型数表示的。计算机内部是用一个字节的整型数表示的。3.8.2 算术运算符和算术表达式2.算术表达式和运算符的优先级与结合性算术表达式和运算符的优先级与结合性(1)算术表达式定义算术表达式定义 用算术运算符和括号将运算对象(也称操作数)连接起来,符合用算术运算符和括号将运算对象(也称操作数)连接起来,符合C语言规则的语言规则的式子,称为算术表达式。运算对象包括常量、变量、函数等。如:式子,称为算术表达式。运算对象包括常量、变量、函数等。如:a*b+c/d 46+2*PI*R a*sin(x)+b*cos(x)都是合法的算术表达式。都是合法的算术表达式。(2)运算符的的优先级与结合性运算符的的优先级与结合性 运算符有优先级高低之分,遵循的原则是运算符有优先级高低之分,遵循的原则是“先乘除,后加减先乘除,后加减”。若一个运算对象两侧的运算符优先级别相同时,则按规定的若一个运算对象两侧的运算符优先级别相同时,则按规定的“结合方向结合方向”处处理。算术运算符的结合方向为理。算术运算符的结合方向为“自左至右自左至右”,即先左后右。,即先左后右。自左至右的结合方向又称为自左至右的结合方向又称为“左结合性左结合性”,但有的运算符结合方向为,但有的运算符结合方向为“自右自右至左至左”,即为,即为“右结合性右结合性”,如赋值运算符,如赋值运算符“=”。3.强制类型转换运算符强制类型转换运算符 可以利用强制类型转换运算符将一个表达式转换成所需类型。如:(double)a (将a转换成double类型)(int)(x+y)(将x+y的值转换成整型)其一般形式为:(类型名)(表达式)注意,表达式应该用括号括起来。如果写成(int)x+y;则只将x转换成整型,然后与y相加。需要说明的是在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。例:(int)x (不要写成int(x)如果x原指定为float型,进行强制类型运算后得到一个int型的中间变量,它的值等于x的整型部分,而x的类型不变(仍为float型)。例:强制类型转换 main()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);运行结果如下:x=3.600000,i=34.4.自增、自减运算符自增、自减运算符+自增1 自减1设有int i=3;则:+i,i+都会使i变为4,但有区别:+i:先使i值+1,再使用i值;i+:先使用i值,再使i值+1.j=+i;j=4,i=4.(i=i+1;j=i;)j=i+;j=3,i=4.(j=i;i=i+1)同理:i,i ,均使i值1,但:又如:printf(i=%dn,i+);结果:i=3若:printf(i=%dn,+i);结果:i=4i :先使用i值,再使i值1i=3;几几点注意点注意:1.+和 运算法只能用于变量,不得用于常量和表达式.2.+,的结合性为从右至左,而一般算术运算符为从左至右。如:如 5+,(a+b)+均为不合法.i+和+为同一优先级.i+相当于(i+)若 i=3,则结果为3,i为4.+,主要用于循环变量自增或自减。3、自增与自减运算符优先级高于算术运算符优先级,而与负值()运算符同级。如:i=2;j=-i+;“”“”是同级优先关系。按从右至左结合方向,表达式-i+相当于-(i+)。5.有关表达式使用中的问题说明有关表达式使用中的问题说明1.要慎用+、运算符。则:先对i进行3次自加,为6,然后三个i相加为18,而i为6。如:表达式(i+)+(i+)+(i+)(i=3)一般认为:从左至右:3+4+5=12,i6.但Turbo C.MSC 都是先取三个原值相加:i+i+i=9 i6如果表达式数为:k=(+i)+(+i)+(+i)2.在表达式中,有的运算符为一个字符,有的为两个字符。3.在函数调用时,如:一般地:自左至右尽可能多地将若干字符组成一个运算符。例:i+j,究竟理解为(i+)+j还是i+(+j)?printf(%d,%d,i,i+);若i=3,若参数计算从左至右,则输出 3,3若从右至左,则输出4,3上述问题看似复杂,最好上机实践.3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式.赋值运算符赋值运算符 语言的赋值运算符为“=”,它的作用是将一个数据赋给一个变量。例如:x=10/*将10赋给变量x*/y=3*x+5*a/*将表达式之值赋给变量y*/2.类型转换类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。(1)将实型数据赋给整型变量时,舍弃实数的小数部分。(2)将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。(3)将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float 变量的存储单元中。但应注意数值范围不能溢出。(4)字符型数据赋给整型变量时,由于字符只占1个字节,而整型变量为2个字节,因此将字符低8位放到整型低8位中。(5)将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量。(6)将带符号的整型数据(int 型)赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中,如果int型数据为正值,则long型变量的高16位补0;如果int型变量为负值,则long型变量的高16位补1,以保持数值不改变。反之,若将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到整型变量。(7)将unsigned int 型数据赋给long int 型变量时,不存在符号扩展问题,只需将高位补0即可。(8)将非unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋。3.复合的赋值运算符复合的赋值运算符 在赋值符在赋值符“=”之前加上其他运算符,可以构成复合的运算符。之前加上其他运算符,可以构成复合的运算符。例如:例如:x+=5等价于等价于x=x+5x*=y+8等价等价于于x=x*(y+8)x%=3等价于等价于x=x%3a*=b等价等价于于a=a*b语言可使用的复合赋值运算符有语言可使用的复合赋值运算符有10种。它们是:种。它们是:+=、=、*=、/=、%=(与算术运算符组合)(与算术运算符组合)=(与位移运算符组合)(与位移运算符组合)&=、=、=(与位逻辑运算符组合)(与位逻辑运算符组合)复合赋值表达式的格式为:复合赋值表达式的格式为:例如:例如:x+=a+y*3等价于等价于x=x+(a+y*3)若若a的初值为的初值为12,则则a+=a-=a*a的求解过程为:的求解过程为:(1)先进行先进行a-=a*a的运算,它相当于的运算,它相当于a=a-a*a=12-144=-132 (2)再进行再进行a+=-132的运算,它相当于的运算,它相当于a=a+(-132)=-132-132=-2644.赋值表达式赋值表达式(1)赋值表达式的构成赋值表达式的构成由赋值运算符将一个变量和一个表达式连接起来的式子称作由赋值运算符将一个变量和一个表达式连接起来的式子称作“赋值表达式赋值表达式”。它的一般形式为:它的一般形式为:赋值表达式当中的赋值表达式当中的“表达式表达式”,又可以是一个赋值表达式。如:,又可以是一个赋值表达式。如:a=(b=10)b=10是一个赋值表达式,整个赋值表达式是一个赋值表达式,整个赋值表达式a的值也是的值也是10。a=(b=10)和和a=b=10等价。等价。x=y=z=8(赋值表达式之值为赋值表达式之值为8,x,y,z值均为值均为8)x=10+(y=5)(表达式值为表达式值为15,x值为值为15,y值为值为5)a=(b=10)/(c=2)(表达式值为表达式值为5,a值为值为5,b值为值为10,c值为值为2)(2)优先级优先级 赋值运算符优先级低于算术运算符、关系运算符和逻辑运算符,赋值运算符优先级低于算术运算符、关系运算符和逻辑运算符,如:如:x=6y 先求关系表达式先求关系表达式6y的值的值0或或1,再将其值赋给变量再将其值赋给变量x。(3)结合律结合律 赋值表达式按照自右至左的顺序结合。例如:赋值表达式按照自右至左的顺序结合。例如:x=y=3*z/w 运算顺序为:运算顺序为:x=(y=3*z/w)又:又:a=b=20/4 运算时先计算运算时先计算20/4,结果为,结果为5,将将5赋给赋给b,再将,再将5赋给赋给a。自右至左运算。自右至左运算。逗号表达式一般形式:表达式1,表达式2其计算规则:先计算表达式1,再计算表达式2,最后值为表达式2的值。例:a=35,a 4 则:先计算3 5,a15,a 4=60,结果为60。3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式 C语言提供一种特殊的运算符逗号运算符。用它将两个表达式连接起来,如:3+5,6+8 称为逗号表达式,又称为“顺序求值运算符”。又如:(a=35,a 4),a+5 逗号表达式的一般形式可以扩展为:表达式1,表达2,表达式n,结果为20(作为逗号表达式的值)a+5a 即 20a.3 5=15a a 4=60 (此时a值仍未变)结果为表达式n的值 逗号运算符是所有运算符中级别最低的。注意:x=(a=3,63)赋值表达式,x18;x=a=3,6 a 逗号表达式,x3.逗号表达式主要用于某些语句中需一次计算多个表达式值的情况。如在循环语句中。注意并不是任何地方出现的逗号都是作为逗号运算符。如函数调用中的实参之间虽然用的是逗号间隔,但不是逗号表达式。如:printf(%d,%d,%d,a,b,c);