520 likes | 637 Views
第三章 数据类型、运算符与表达式. 本章重点、难点: 1、 自加、自减运算 2. 类型转换 3. 复合的赋值运算符. 第三章 数据类型、运算符与表达式. 3.1 基本概念 1、 C 语言程序的组成特点 一个 C 源程序由函数构成, 其中至少包含一个主函数( main 函数) 。 C 程序总是由 main 函数开始执行。 分号 “ ; ” 是 C 语言的一部分。 C 程序书写格式自由,一行内可以写多条语句,且语句中的空格和回车符均可忽略不计。
E N D
第三章数据类型、运算符与表达式 本章重点、难点: 1、自加、自减运算 2. 类型转换 3. 复合的赋值运算符
第三章数据类型、运算符与表达式 • 3.1 基本概念 • 1、C语言程序的组成特点 • 一个C源程序由函数构成, 其中至少包含一个主函数(main函数)。 • C程序总是由main函数开始执行。 • 分号“;” 是C语言的一部分。 • C程序书写格式自由,一行内可以写多条语句,且语句中的空格和回车符均可忽略不计。 • 程序的注释部分应括在/*……*/之间;/和 *之间不允许留有空格;注释都分允许出现在程序中的任何位置上。
2、标识符 C语言的标识将可分为以下三类: 一、关键字(附录B) C语言共有32个关键字;每个关键字在C程序中都代表着某一固定含意,所有关键字都要用小写英文字母表示,且这些关键字都不允许作为用户标识将使用。 二、预定义标识符 这些标识符在C语言中都具有特定含意,如C语言提供的库函数的名字和预编译处理命令。因此为了避免误解,建议用户不要把这些预定义标识符作它用或将它们重新定义。
三、用户标识符 • 用户可以根据需要对C程序中用到的变量、符号常量、自己的函数或文件指针进行命名,形成用户标识符。这类标识符的构成规则如下:(P39) • 由英文字母、数字、下划线组成;且第一个字符不能是数字,必须是字母或下划线。 如:sum, average, class, student_name 正确 • M.D, $123, 3D64, a >b错误 • 大、小写英文字母的含意不同。 • 注意: 大写字母和小写字母被认为是两个不同的字符。因此,sum和SUM是两个不同的变量名。习惯上,变量名用小写字母表示,以增加可读性。
整 型 字符型 单精度 基本类型 浮点型 枚举类型 双精度 数据类型 数组类型 构造类型 结构体类型 共用体类型 指针类型 空类型 3、C语言的数据类型
3.2 常量(Constant) ⒈常量的概念 在程序中不能改变的量称为常量。常量的类型由数据的外部表现形式确定。如12、0、-3等为整型常量,4.6,-1.23等为实型常量,’a’,’d’为字符常量,一般从其字面形式即可判别,也可以用一个标识符代表一个常量,即符号常量。 #define PRICE 30 main() /*test2.c */ { int num,total; num=10; total=num*PRICE; printf("total=%d",total); } 实例运行
3.3 变量( Variable) ⒈变量的概念 变量是在程序中可以改变的量,变量具有三个特征: ⑴变量有名,用标识符命名; ⑵变量有类型; ⑶在程序中可以改变。 变量对应于内存中某一地址下的几个单元,变量名作为程序引 用变量的标志。变量的类型确定了变量在内存中所占单元的数量及 其表示的方式。变量的地址可以通过&运算获得。 int a; 整型变量占两个内存单元。 a变量的引用标志 &a对应a的地址。 内存 变量必须先说明后使用!说明的目的是确定变量的名字和类型。
3.4 整型数据 ⑴整型常量的表示 整型常量根据表示的范围可以有长整型和一般整型,还可以表 示为十进制、八进制、十六进制。其中八进制、十六进制不能有符 号。 一般整型的表示 进 制 表示举例 范 围 字节数 十 进 制 2304 -32768 ~ +32767 2 八 进 制04400 0 ~0177777 2 十六进制 0xaa00 0x0000 ~ 0xffff 2 长整型的表示 进 制 表示举例 范 围 字节数 十 进 制 -21234l -231 ~ +231-1 4 八 进 制 04400l 0 ~ 01777777777 4 十六进制 0xaa00l 0x0000----0xffffffff 4
3.4 整型数据 ⑵整型变量的分类 ①有符号整型变量说明 说明符 所占字节数 范围 int 2 -32768 ~ +32767 short [int] 2 -32768 ~ +32767 long [int] 4 -2147483648 ~ +2147483647 ②无符号整型变量说明 说明符 所占字节数 范围 Unsigned int 2 0 ~ 65535 unsigned short 2 0 ~ 65535 unsigned long 4 0 ~ 4294967295 各种整型数据所占的字节数说明见P42
3.4 整型数据 ⑶ 整型变量的定义 C规定在程序中所有用到的变量都必须在程序中指定其类型,即“定义”。 例如: int a,b; (指定变量a,b为整型) unsigned short c,d; (指定变量c,d为无符号短整型) 1ong e,f; (指定变量e,f为长整型) 对变量的定义,一般是放在一个函数的开头部分(也可以放在程序中间,但作用域只限于某一分程序,这将在后面介绍)。
3.4 整型数据 ⑶ 整型变量的定义(举例) /* test3.c */ 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("c=%d d=%d",c,d); } 实例运行 不同种类的整型数据可以进行算术运算。
(4) 整型数据的溢出 #include <stdio.h> void main() { int a,b; a=32767;b=a+1; printf(“a=%d,b=%d\n”,a,b); } 运行结果? a=32767,b=-32768
3.5 实型数据 (1) 浮点型常量的表示(只有十进制表示) 浮点型常量有两种表示方式:小数表示方法,指数表示方法。 小数表示方式规则:一个小数点、符号和至少一位数字。 指数表示方式规则: -2.0 1. 0.11113 -15. 规则:ne±m 表示 n×10m 指数部分 n小数部分,整型常量或小数形式表示的实型常量。 n决定精度,一般精度为7位;m决定范围,范围10-38到10+38,当超过范围时称为“溢出”,小于10-38称为下溢,当0处理,大于10+38,称为上溢,系统出错! 123.456 可表示为 12.3456E+1 可表示为 1.23456e2 (规泛化的指数形式) 可表示为 0.123456e3
3.5 实型数据 (2) 实型变量 C实型变量分为单精度(float型)和双精度(double型)两类,对每一个实型变量都应在使用前加以定义。如: float x; /*一个float型数据在内存中占4个字节(32位)*/ double z; /*一个double型数据占8个字节。*/ 单精度实数提供7位有效数字,双精度实数提供15~16位有效数字,数值的范围随机器系统而异。单精度实数的数值范围约为10-38~1038,双精度实数范围约为10-308~10308。 实型常量不分float型和double型。一个实型常量可以赋给一个float型或double型变量。根据变量的类型截取实型常量中相应的有效位数字, 说明符 所占字节数 范围 精度 float 4 10-38 ~ 10+38 7位 double 8 10-306 ~10+306 16位
3.5 实型数据 (2) 实型变量 例: main() /*test4.c*/ { float s; s=111111.11; printf("\nfloat=%f",s); } main() /*test5.c*/ { double s; s=111111.11; printf("\ndouble=%f",s); } 实例运行 实例运行 自学:P47 浮点型数据的舍入误差
3.6 字符型数据 (1) 字符常量的表示 字符常量用单撇号括起来的一个字符。字符有一个整型值,即该字符的ASCII码值。字符常量的表示方法:’a’、 ’!’ 。 值为:97 (2) 字符串常量的表示 双引号定界的字符序列。系统会在最后一个字符后加NULL(ASCII码值为0)标志字符串的结束。 如:”HEFEI ””hello” ’a’ 和 ”a”的区别? 内部 ’a’ :97 ”a”: 97NULL
3.6 字符型数据 (3) 转义字符 转义字符是C语言表示字符的特殊方法,用来表示ASCII字符集 中的控制字符,以及系统占用字符如:”。 表示方法:① \字符;②\八进制(十六进制整数,小于256) \\ 表示\ 符号 \’ 表示’ \” 表示” \b 表示回退一格 字母 \n 表示换到下一行头 \r 表示回车到本行头 \t 表示TAB(占8列) \ddd 1到3位八进制数所代表的字符 \xhh 1到2位十六进制数所代表的字符 结果? main() {printf ("\\141\141abc\n");}
3.6 字符型数据 (4)转义字符举例 main() /*test7.c*/ { printf(" ab c\t de\rf\tg\n"); printf("h\ti\b\bj k"); } 运行结果: f_ _ _ _ _ _ _ gde h_ _ _ _ _ _ j _ k 实例运行
3.6 字符型数据 (5)字符变量 一个字符占一个字节. 字符型变量用来存放字符常量,注意只能放一个字符,不要以为在一个字符变量中可以放一个字符串(包括若干字符)。 字符变量的定义形式如下: char c1,c2; 它表示c1和c2为字符型变量,各可以放一个字符,因此可以用下面语句对c1、c2赋值: c1=‘a’; c2=‘b’; 一般以一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。 说明符 所占字节数 范围 char 1 -128 ~ +127 unsigned char 1 0 ~ 255
3.6 字符型数据 (6)字符数据在内存中的存储形式及其使用方法 将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。 例如字符‘a’的ASCII代码为97,‘b’为98, 。实际上是以二进制形式存放的. main( ) { char c1,c2; c1=97;c2=98; printf(“%c %c”,c1,c2);} 运行结果: a b
3.6 字符型数据 (6)字符数据在内存中的存储形式及其使用方法 字符数据以ASCII码存储,它的存储形式与整数的存储形式相类似。C语言使字符型数据和整型数据之间可以通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后输出。以整数形式输出时,直接将ASCII码作为整数输出。也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。
3.6 字符型数据 (6)字符数据在内存中的存储形式及其使用方法 字符数据与整型数据可以互相赋值。如: int i; char c; i=’a’; c=97; 是合法的。 字符数据可以以字符形式输出,也可以用整数形式输出。例如在上面语句之后执行语句: printf (”%c,%d\n”,c,c); printf (”%c,%d\n”,i,i); printf (”%c,%d\n”,i-32,i-32); 输出的结果是什么?
3.6 字符型数据 (7)字符串常量 字符常量是由一对单引号括起来的单个字符。C语言除了允许使用字符常量外,还允许使用字符串常量。字符串常量是一对双引号括起来的字符序列。如: “How do you do。”,”CHINA”,”$123.45” 都是字符串常量,可以输出一个字符串,如 printf (”How do you do.”); char c; c=’a’; c=”a”; right error c=”CHINA” ? 不能把一个字符串赋给一个字符变量。
3.6 字符型数据 (7)字符串常量 C规定:在每一个字符串的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。c规定以字符‘\0’作为字符串结束标志。‘\0’是一个ASCII码为0的字符,从ASCII代码表中可以看到ASCII码为0的字符是,“空操作字符”,即它不引起任何控制动作,也不是一个可显示的字符。 如果有一个字符串,“CHINA”实际上在内存中是 : 它的长度6个字符,最后一个字符为’\0’。但在输出时不输出. 例如: printf(”How do you do。”) 输出时一个一个字符输出,直到遇到最后的’\0’字符,就知道字符串结束,停止输出。‘\0’,字符是系统自动加上的。
3.7 变量赋初值 程序中常需要对一些变量预先设置初值。C规定,可以在定义变量时同时使变量初始化。如: int a=3; 指定a为整型变量,初值为3 float f=3.56; 指定f为实型变量,初值为3.56 char c=’a’; 指定c为字符变量,初值为‘a’ 也可以使被定义的变量的一部分赋初值。如: int a,b,c=5 表示a、b、c为整型变量,只有c初始化,值为5。 如果对几个变量赋以同一个初值,不能写成: int a=b=c=3; ERROR! 而应写成: int a=3,b=3,c=3;RIGHT!
3.8 各类数值型数据间的混合运算 整型、单精度型、双精度型数据可以混合运算。前已述及,字符型数据可以与整型通用,因此,整型、实型(包括单、双精度)、字符型数据间可以混合运算。例如 10+‘a’+1.5-8765.1234*‘b’ 是合法的。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则按下图所示 double ← float↑long↑unsigned↑int ← char, short
3.8 各类数值型数据间的混合运算 • 图中横向向左的箭头表示必定的转换,如字符数据必定先转换为整数,short型转为int型,float型数据在运算时一律转换成双精度型,以提高运算精度(即使是两个float型数据相加,也都先化成double型,然后再相加)。 • 纵向的箭头表示当运算对象为不同类型时转换的方向。例如int型与doub1e型数据进行运算,先将int型的数据转换成图double型,然后在两个同类型(double型)数据进行运算,结果为double型。注意箭头方向只表示数据类型级别的高低,由低向高转换,不要理解为int型先转成unsigned型,再转成1ong型,再转成double型。如果一个Int型数据与一个double型数据运算,是直接将int型转成double型。同理,一个int型与一个Long型数据运算,先将int型转换成1ong型。
3.8 各类数值型数据间的混合运算 举例说明: • 假设已指定i为整型变量,f为float变量,d为double型变量,e为1ong型,有下面式子: 10十’a’+i*f-d/e • 运算次序为:①进行10+’a’的运算,先将‘a’转换成整数97,运算结果为107。②进行i*f的运算。先将i与f都转成double型,运算结果为double型。③整数107与i*f的积相加。先将整数107转换成双精度数(小数点后加若干个0,即107.000…00),结果为double型。④将变量e化成double型,d/e结果为double型。⑤将10十’a’+i*f的结果与”d/e结果为double型。 • 上述的类型转换是由系统自动进行的。
3.9 算术运算符和算术表达式 • 3.9.1 C运算符简介 • C的运算符有以下几类:(13种) • 1.算术运算符 (+ - * / %) • 2.关系运算符 (> < == >= <= !=) • 3.逻辑运算符 (! && ||) • 4.位运算符 (<< >> ~ | ^ &) • 5.赋值运算符 (= 及其扩展赋值运算符) • 6.条件运算符 (? :)
3.9 算术运算符和算术表达式 7. 逗号运算符 (,) 8.指针运算符 (* 和 &) 9.求字节数运算符 (sizeof) 10.强制类型转换运算符 (类型) 11.分量运算符 (. →) 12.下标运算符 ([ ]) 13.其它 (如函数调用运算符()) 本章只介绍算术运算符和赋值运算符。
3.9 算术运算符和算术表达式 1. 基本的算术运算 功能:完成各种类型数据的加、减、乘、除及求余数运算。 双目算术运算(两个运算对象参加的运算) -12%5 -2 “向零取整”. -5/3 = -1 只能对整型或字符型数据运算。余数符号与被除数相同。 ? -12%(-5)
main() {int a,b; float c; a=12; b=5; c=a/b; printf ("c=%f\n",c); } 注:两个整数相除,结果为整数 C=2.000000 输出结果?
3.9 算术运算符和算术表达式 2. 算术表达式和运算符的优先级与结合级 ( 附录C ) C算术表达式:用算术运算符和括号将运算对象(也称操作数) 连接起来的、符合C语言语法规则的式子。 如: a * b / c - 1.5 + ’a’ 求表达式的值时,先按运算符的优先级别高到低的次序执行。 例: a + b*c 算术运算符的结合方向为:“自左至右” 例: a-b+c double ← float↑long↑unsigned↑int ← char, short • 如果一个运算符的两侧的数据类型不同,则会按右边所述,先自动进行类型转换,使二者具有同一种类型,然后进行运算。
3.9 算术运算符和算术表达式 • 强制类型转换运算符 强制类型转换运算符将一个表达式转换成所需类型 (double)a (将a转换成double类型) (int)(x+y) (将x+y的值转换成整型) (float)(5%3) (将5%3的值转换成float型) 其一般形式为 : (类型名)(表达式) 注意: 表达式应该用括号括起来。如果写成 (int)x+y只将x转换成整型,然后与y相加。 需要说明的是在强制类型转换时,得到一个所需类型的中间量,原来变量的类型未发生变化。例如 (int)x (不要写成int (x)) 如果x原指定为float型,进行强制类型运算后得到一个int型的中间变量,它的值等于x的整数部分,而x的类型不变(仍为float型)
3.9 算术运算符和算术表达式 main ( ) { float x; x=3.6; i=(int)x; printf(“x=%f,i=%d”x,i); } 实例运行 结论:两种类型转换:一种是系统自动进行类型转换 一种是强制类型转换 当自动类型转换不能实现目的时,可以用强制类型转换。如: “%”运算符要求其两侧均为整型量,若x为float型,则“x%3”不合法,必须用:(int)x%3”。强制类型转换运算优先于%运算,因此先进行(int)x的运算,得到一个整型的中间变量,然后再对3求模。
3.9 算术运算符和算术表达式 4. 自加、自减运算(单目运算):本章重点、难点 结合方向:自右至左 说明: ①运算对象只能是一个变量(不能对常量和表达式)。 ②前置是先运算,后引用,而后置则是先引用,后运算。 int i, x; i=5; x=i++;/* x=i;i=i+1;*/ i=5; x=++i;/* i=i+1;x=i;*/ 2++; /* Error !*/
3.9 算术运算符和算术表达式 4. 自加、自减运算(单目运算) 自增、自减运算符的用法与运算规则示例。 main() { int x=6, y; printf("x=%d\n",x); y = ++x; printf("y=++x: x=%d,y=%d\n",x,y); y = x--; printf("y=x--: x=%d,y=%d\n",x,y); } 实例运行
3.9 算术运算符和算术表达式 5. 有关表达式使用中的问题说明 C运算符和表达式使用灵活 (1)a=3; j=(a++)+(a++)+(a++); printf(“a=%d,j=%d”,a,j); 结果为: a=6 j=9 如何理解?(P58) (2)i+++j 为(i++)+j 还是 i+(++j) 呢? C编译系统在处理时尽可能多地(自左向右)将若干个字符组成一个运算符,因此, i+++j=(i++)+j (3)i=3; printf(“%d,%d”,i,i++);在多数系统中对函数参数的求值顺序是自右而左。 故上面的结果为: 4,3
3.10 赋值运算符和赋值表达式 1. 赋值运算符 赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“a=3”的作用是执行一次赋值操作(或称赋值运算)。把常量 3 赋给变量a,也可以将一个表达式的值赋给一个变量。 2. 类型转换(难点) 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。具体有以下几种情况:
(1).将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。如i为整型变量,执行“i=3.56”的结果是使i的值为3。(1).将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。如i为整型变量,执行“i=3.56”的结果是使i的值为3。 (2).将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中,如将23赋给float变量f,即f=23,先将23转换成23.00000,再存储在f中。如将23赋给double型变量d, 即d=23,则将23补足有效位数字为23.00000000000000,然后以双精度浮点数形式存储到d中。 (3).将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元中。
3.10 赋值运算符和赋值表达式 • (4).字符型数据赋给整型变量时,由于字符只占一个字节,而整型变量为2个字节,因此将字符数据(8位)放到整型变量低8位中。有两种情况: • 如果所用系统将字符处理为无符号的量或对unsigned char型变量赋值,则将字符的8位放到整型变量低8位,高8位补零。例如:将字符‘\376’(八进制)赋给int型变量i i • 如果所用系统(Turbo C++)将字符处理为带符号的量,若字符最高位为0.则整型变量高8位补0;若字符最高位为1.则高8位全补1,这称为“符号扩展”.这样做的目的是使数值保持不变,如将字符‘\376’以整数形式输出为一2,i的值也是一2。 i
3.10 赋值运算符和赋值表达式 (5).将一个int、short、long型数据赋给char变量时,只将其低8位原封不动地送到char型变量中。例: Int I=289; char c; c=I; C=33 I=289 (6). 将带符号的整型数据(int型)赋给1ong型变量时。要进行符号扩展,如果int型数据为正值(符号位为0).则1ong型变量的高16位补0;如int型变量为负值(符号位为1),则1ong型变量的高16位补1,将整型数(int型)的16位送到1ong型低16位中,以保持数值不改变。反之,若将一个1ong型数据赋给一个int型变量,只将1ong型数据中低16位原封不动送到整型变量(即截断)
main() { long b=0x12340123; int a; a=b; printf("\n%d",a); } 结果? 291
3.10 赋值运算符和赋值表达式 • (7)将unsigned int 型数据赋给long int,不存在扩展问题,只需将高位补0即可。将一个unsigned 类型数据赋给一个占字节数相同的的非unsigned型变量(例如unsigned int→int , unsigned long→long , unsigned short→ short )将unsigned型变量的内容原样送到非unsigned型变量中,但如果数据范围超过相应整型的范围,则会出现数据错误。如: • unsigned int a=65535 (216-1); int b; b=a; • printf(“%d”,b); • 将a整个送到b中,由于b是int型,第1位是符号位,成了负数。(-1的补码) • 运行结果为:-1 • 自学:P62小结
3.10 赋值运算符和赋值表达式 3. 复合的赋值运算符 说明: ①运算对象的左值只能是一个变量。 (a+2)+=5; /*Error !*/ ②%=运算的对象,必须是整性。 思考: a=12; a/=a+a; 结果? a=0
3.10 赋值运算符和赋值表达式 4. 赋值表达式(重点、难点) 赋值表达式:由赋值运算符将一个变量和一个表达式连接起来的式子。(结尾无分号) 它的一般形式为: (变量)(赋值运算符)(表达式) 例如: “a=5”这个赋值表达式的值为5(变量a的值也是5)。 赋值表达式中的“表达式”,又可以是一个赋值表达式。 如: a=(b=5) 括弧内的“b=5”是一个赋值表达式,因此“a=(b=5)”相当于“a=5”,a的值等于5,整个赋值表达式的值也等于5。赋值运算符按照“自右而左”的结合顺序
3.10 赋值运算符和赋值表达式 4. 赋值表达式 a=b=c=5 (赋值表达式值为5,a b c值均为5) a=5+(c=6) (表达式值为11,a值为11,c的值为6) a=(b=10)/(c=2)(表达式值为5,a等于5,b等于10,c等于2) 赋值表达式也可以包含复合的赋值运算符。如 a+=a-=a*a 也是一个赋值表达式。如果a的初值为12,此赋值表达式的求解步骤如下:①先行“a-=a*a”的运算,它相当于a=a一a*a=12一144=一132。②再进行“a十=一132”的运算,相当于a=a十(一132)=一132一132=一264。
将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其它语句(如循环语句)中,这是C语言灵活性的一种表现。如:将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其它语句(如循环语句)中,这是C语言灵活性的一种表现。如: Printf (“%d”,a=b); 若b=3,则输出a=3,在一个语句中完成了赋值和输出双重功能。
3.11 逗号运算符和逗号表达式 用它将两个表达式连接起来。如 :3十5,6十8 称为逗号表达式。逗号表达式的一般形式为: 表达式1,表达式2 逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号表达式“3+5,6+8”的值为14。又如,逗号表达式 a=3*5,a*4 该如何理解?(a=15,表达式的值为60) 一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,如: (a=3*5,a*4), a+5 先使a的值等于15,再进行a*4(但a值未变),再进行a+5得20,即整个表达式的值为20。
3.11 逗号运算符和逗号表达式 逗号表达式的一般形式可以扩展为: 表达式1,表达式2,表达式3,……表达式n 它的值为表达式n的值。 逗号运算符是所有运算符中级别最低的。因此,下面两个表达式的作用是不同的: ① x=(a=3,6*3) ② x=a=3,6*a ? 求x的值