[工学]第3章 数据类型_运算符与表达式.ppt_第1页
[工学]第3章 数据类型_运算符与表达式.ppt_第2页
[工学]第3章 数据类型_运算符与表达式.ppt_第3页
[工学]第3章 数据类型_运算符与表达式.ppt_第4页
[工学]第3章 数据类型_运算符与表达式.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

用计算机解决实际问题要借助数学 模型,即要把问题化成对数据的处理。 不同的问题需要不同的数据类型,不同 的数据类型有不同的存储方式,并且, 允许的运算也不同。 第3章 数据类型、运算符与表达式 3.1 C的数据类型 一、 C语言数据类型 C语言提供了丰富的数据类型,除 了空类型外,C语言的数据类型可分成 三类,具体情况如下图表示: 由这些数据类型还可以构成更复 杂的数据结构。 短整型(short) 整型 整 型(int) 数值类型 长整型(long) 基本(简 实型 单精度型(float) 单)类型 双精度型(double) 字符类型(char) 枚举类型(enum) (第11章介绍) 数组类型 (第7章介绍) 数据类型 构造类型 结构体类型(struct) (第11章介绍) 共用体类型(union) (第11章介绍) 指针类型 (第10章介绍) 空类型(void) 二、数据类型的使用 1、计算机中存储和运算的数据都有一定的类型 (1)常量的类型:由常量的形式确定。例如1234 是整型,13.89是实型等。 (2)变量的类型:必须在程序的说明部分定义, 即“先定义、后使用” 2、程序设计应综合考虑算法和数据结构(数据类 型) 3. 2 常量与变量 3.2.1常量:在程序运行过程中其值保持不 变的量,可分为: 1、直接(字面)常量:直接表示的常量。 如12、0、-3为整型常量,4.6、-1.23为 实型常量,a、3为字符常量等。 2、符号常量:用标识符表示的常量 (1)用法:用预编译命令#define 定义(习惯用 大写字母组成的标识符表示),如: #define PI 3.14159 (2)定义符号常量的好处: 意义明确 便于统一修改 例3.1 (P39) 3.2.2 变量:在程序运行过程中其值可变的量 。 一、变量的三个要素:变量名、变量的存储单 元和变量的值 (1)变量名:用标识符表示,其中字母一般用 小写字母。 变量名的作用: 代表内存中相应的存储单元 代表该存储单元存储的数据。 (2)变量存储单元的地址: 地址用“/*定义(有符号)字符型变量ch1,ch2*/ int i, j, k; /*定义(有符号)整型变量i,j,k */ float a, b, c; /*定义单精度实型变量a,b,c */ double d, e; /*定义双精度实型变量d,e */ 注意:在一个函数中,不能把一个变量声明成两个或 两个以上类型。 在定义变量的同时可以给变量赋初值,如: int i=3, j=-4, k; char ch1=a, ch2=5; float a=1.5, b=0.0, c; double x, y, z=-25.5; 3. 3 整型数据 引言:整型数据的分类 1、按在内存中的长度(二进制位)分: (1)基本整型,以int表示 (2)短整型,以short int表示,在微机中 与int型相同,都是16位二进制数,short 型较少使用。 (3)长整型,以long int表示,在微机中 是32位二进制数。 2、按有无符号分:有符号(signed)和无符号 (unsigned)两种 因此,整型数据共有6种: 有符号基本整型signed int 无符号基本整型unsigned int 有符号短整型 signed short int 无符号短整型 unsigned short int 有符号长整型 signed long int 无符号长整型 unsigned long int 3.3.1 整型常量的表示方法 1、十进制整型常量 (1)int(或short)型常量:如32767, 0, -56, -32768 (2)无符号整型常数后加u或U,如65535u,12345U等 (3)有符号长整型常数后加l或L,如345678l,-12L等 (4)无符号长整型常数后加lu或LU,如345678lu,35LU等 长整型表示虽然只是在整数之后增加l或L,但占用内 存4个字节(32位)。 2、八进制整型常量:用数字0开头,如0177777, 0273等(注意不能出现大于7的数字,长整型加 后缀l或L) 3、十六进制整型常量:用0x(或0X)开头,如 0x123, 0Xde, 0X2A等(注意字母不能超过f或F ,长整型加后缀l或L) 3.3.2整型变量 一、整型数据在内存中的存放形式:按有符号和无符 号情况不同 1、无符号整型数据(对基本整型、短整型和长整型): 各二进制位均表示数值 如unsigned型数据0的二进制存放为 0000 0000 0000 0000, 二进制存放为1111 1111 1111 1111 十进制数为216-1=65535 2、有符号整型数据(对基本整型、短整型和长整型)的 存储:用补码表示。 原因:解决计算机不能直接表示负数的问题(补码为正 数) 特征:最高位为0为正整数,最高位为1表示负整数 (1)补码计算公式(以16位存储为例,微机的int型和 short型): a (0a32767) a的补码 = 216-|a| (-32768a0) 例如: 整数0存储为 0000 0000 0000 0000 正数1存储为 0000 0000 0000 0001 最大正数32767存储为 0111 1111 1111 1111 -1存储为 1111 1111 1111 1111 -2存储为 1111 1111 1111 1110 -32768存储为 1000 0000 0000 0000 (2)负数补码的求法:可用上式计算(写成二进制),也 可用如下方法求出: 将|a|写成二进制形式 各位取反(1变成0,0变成1)后加1 原理:216-|a|=(216-1)-|a|+1=|a|+1 例如-5,将5写成二进制数 0000 0000 0000 0101 各位取反为 1111 1111 1111 1010 再加1即为-5的补码 1111 1111 1111 1011 (1111 1111 1111 1011 =1111 1111 1111 1111-100=216-1-4=216-5) 可见1111 1111 1111 1111=216-1为-1的补码 1000 0000 0000 0000=215=216-215=215=32768为-32768 的补码(-32768是最小的整数) (3)由负数的补码求十进制负数,可按上面相反 的步骤进行: 将该补码减1后各位取反,写成十进制数即是 该数的绝对值,如: 1111 1111 1111 1011减1为 1111 1111 1111 1010,各位取反为 0000 0000 0000 0101即为-5的绝对值,因此 补码1111 1111 1111 1011对应的十进制负数 即为-5 3、整型数据的取值范围:P43表3.1 二、整型变量的分类与定义 1、分类:按引言分成6类 2、定义:用引言的6种类型标识符定义,如: int a; /*定义有符号基本整型变量a */ unsigned b; /*定义无符号基本整型变量b */ short s1,s2;/*定义有符号短整型变量s1、s2 */ long c; /*定义有符号长整型变量c */ unsigned long d; /*定义无符号长整型变量*/ 例3.2 (P44) 三、整型数据的溢出 1、原因 (1)由于存储的位数有限,大于存储范围的数将溢出 (2)由于有符号的数用补码表示,补码变到表示负数 范围将表示负数 2、溢出的计算(以16位存储为例,长数据存储为整型 时将只保留低16位,即以216为模) (1)无符号整数的溢出:以216(即65536)为模求得余 数即溢出结果 (2)有符号整数的溢出 a、正数:以216(即65536)为模求得余数,余数为 溢出后数的补码(因此可为正数也可为负数)。 b、负数:加216的倍数,使结果a在 32768=a=32767范围,此即溢出后的数。 例3.3(P44) 补充例: main( ) int a, b, c; unsigned u; a=32767+1; b=131071; c=-131071; u=131071; printf(“a=%d,b=%d,c=%d,u=%un”,a,b,c, u); 运行结果为: a=-32768,b=-1,c=1,u=65535 3. 4 实型数据 3.4.1实型常量(通常带小数点或指数,只 能用十进制表示) 1、小数形式(必须有小数点),如:0.123, -12.3, 0.0, 123. ,.5等 2、指数形式,由数值部分和指数部分(e或 E加正负整数)组成,例如: 0.23e5 表示0.23105 -12.345E0 表示-12.345100 10e-5 表示1010-5 注: (1)无数值部分或指数部分为小数或指数部分仅 有e而无整数,如e3, 3e1.2,1.0e等都是错误的 (2)由于指数形式写法多样小数点浮动, 如 3.14159可表示为: 0.0314159102 C语言表示为 0.0314159e+2 3141.5910-3 3141.59e-3 因此实数又叫浮点数。 其中有一位非零整数的叫科学记数法(又叫规范 化指数形式,也是输出的标准形式),如:1.2345e2 , 输出为:1.234500e+2 3.4.2实型变量 1、实型数据的类型与变量的定义 (1)单精度实型(float型),32位(4字节)存储 ; (2)双精度实型(double型),64位(8字节)存储 ; (3)长双精度实型(long double型),128位 (16字节)存储,用得较少。 用这些类型标识符即可定义相应的变量,如 : float x, y; /*定义单精度变量x、y*/ double z; /*定义双精度变量z*/ long double t; /*定义长 双精度变量t*/ 2、实型数据在内存中存放的形式,以float型为例: 例如,float型的实数-32.286e-38的存储情况为: 符号位 规格化的尾数 阶符位 阶码 微机中实型数据的取值范围:P46表3.2 3、实型数据的舍入误差:由于实型有一定精度范围 ,实型数据是有误差的,如:4.0/3.0*3.0不等于 4.0,然而整数是没有误差的。 例3.4(P47) 0.32286036 3.4.3实型常量的类型 1、参加运算时一般作为double型数据 2、给变 量赋值时 按变量的类型进行转 换 3. 5 字符型数据 3.5.1字符常量 1、可见字符:加单引号表示,如a、A、5 、!等。 注意: (1)单撇号中只能是一个字符,abc是错误的; (2)只能用单撇号而不能用双撇号,“a“是错误的(“a“ 表示一个字符串); (3)空格也是一个字符, 与连续的两个单撇号 ( 表示无字符)不同; (4)反斜杠和单、双撇号字符不能表示为: 和 、“,而应表示为转义字符 和 、”。 2、转义字符:用加1-3个字符组成(P48表3.3) (1)控制字符,如n、t等 (2)用ASCII码表示字符,可以表示任何字符, 包括不能用键盘输入的扩展ASCII码字符 a、八进制ddd(一到三位八进制数ddd前 可加0或不加0), 如:101=A,12=n, 0362= b、十六进制xhh(x不能大写,且x前不能 加0) 如:x41=A,xa=n, xF2 = 例3.5(P49) 3.5.2字符变量 1、字符数据类型 有符号字符类型 signed char /*取值范围为-128127*/ 无符号字符类型 unsigned char /*ASCII码范围0255*/ 说明:char型和unsigned char型值在0127范围均为 ASCII码字符,unsigned char型值在128255范围 为扩展ASCII码字符。 2、字符变量的定义:用上述类型标识符定义, 例如: char c1=A, c2; unsigned char c3=5, c4=0362; 3.5.3字符数据的存储及其使用 1、存储 (1)unsigned char型:1字节(8位)二进制信息 (ASCII码或扩展ASCII码),数值范围0255,例 如字符A: 要记住几个常用字符的ASCII码(十进制): A (65)与a (97)相差32, 0(48),空格 (32)等。 大写字母之间、小写字母之间、数字之间字符的 ASCII都是连续的。 0 1 0 0 0 0 0 1 (2)char型:有符号字符型数据也是1字节(8位)二进 制信息,与有符号整型类似,也用补码存储,只是 长度为1字节,表示数值范围-128127。设c是 char型数据,则: c (0c127) c的补码 = 28-|c| (-128c0) C语言中设置有符号字符类型的目的是为了与整数 通用。 2、字符的ASCII码 (1)标准ASCII码:0127,最高位均为0,有、无符 号一样; (2)扩展ASCII码:128255,最高位均为1,因此是 unsigned char型 3、字符数据的使用 例1 main( ) char ch; ch=A; printf(“%c=%dn”, ch, ch); 运行结果为 A=65 即字符可以用整数格式输出。 例2 main( ) char ch; int i; ch=A; ch=ch+32; i=ch; printf(“%d is %cn”, i, i); printf(“%c is %dn”, ch, ch); 运行结果为 97 is a a is 97 这说明对应ASCII码值的整数可按字符格式输出;字 符数据也可按整数输出。 结论:在ASCII码的范围(0127)内,字符和整数相 互通用。虽然它们的存储格式不同(1字节和2字节 ),但系统可自动转换。 例3.6(P50),例3.7(P51) 例3 main( ) char c; c=0362; /*八进制数,相当于十进制数242*/ printf(“%c%dn”, c, c); 运行结果为 -14,解释如下: c是有符号字符型变量,赋给八进制数0362即十进制 数242后当作补码存储。由于242=28-14,即是-14的补 码。输出时%c为字符输出,故转换成无符号型字符, 即扩展ASCII码242的字符输出;而%d为整数输出, 直接将补码转换成对应的整数补码,其值-14不变,即 输出-14。 字符类型数据的溢出情况与整数溢出情况类似, 只是模为256(请思考)。 3.5.4字符串常量 1、形式:一对双撇号括起的一个或多个ASCII码字符, 如:“hello“、“%3dn“、“z“等。 2、存储:双撇号中的ASCII码字符和0(系统自动添 加的ASCII码为0的字符,作为字符串的结束符),如 : “hello”共5个字符占6个字节,存储的是 6个字符的 ASCII码: 例:“23.5256x5fn”共8个字符占9个字节 其中、256、x5f、n分别代表一个字符 注意:字符A与字符串”A”的区别,字符串”A” 存储两个字符:A和0;“”为空字符串, 但存有0。 说明:C语言中没有字符串变量,相应功能由字符数组 等完成。 h e l l o 0 104 101 118 118 111 0 3. 7不同类型数据间的混合运算及类型转换 在C语言中,基本数据类型均为数值类型。其中除了实型 外,其余类型均用整数存储(包括整型、字符型、逻辑值、枚举 值等)。C语言规定基本数据类型都可以相互转换,因此可以混 合运算,这使得C语言具有很大的灵活性。 一、不同类型的差异:存储数据范围越大、精度越高、类型越 高级(P54图3.10) 低级 高级 1、实数中短与长:float double 2、整数与实数:char,short,int,long float,double 3、整数中短与长:char short int long 4、同长整数中有符号与无符号:signed unsigned 二、出现类型转换的情况 1、混合运算时:系统自动按运算顺序将低 级的数据直接转换成高级的数据;当出现整 数与实数混合运算时,直接将整数转换成 double型。 例1:计算 10+a+1.5- 8765.1234*b 例2:int i;float f;double d;long e; 计算 10+a+i*f-d/e 注意:% (求模余数运算符)的两边只 允许出现整数! 2、赋值运算时:系统自动将表达式的值转换成变量 的类型存到变量的存储单元。 例如:float a; a=5+A; 3、函数调用时:系统自动将实参的值转换成形参变 量的类型 4、输入、输出时:数据转换成格式控制符的类型 以上四种类型转换均为系统自动转换,又叫隐式转换 。 5、强制类型转换 形式:(类型)(表达式) 作用:将表达式的值强制转换成相应类型 例如:计算 (int)12.56%5 12%5 结果为2 三、数据类型之间的转换产生的一些效果: 1、提升与降格 a、提升: 短数据 长数据 整数 浮点数(实数) 整数中signed unsigned b、降格:与提升相反 2、符号位扩展与零扩展保持数值不变 a、符号位扩展(signed型短数据变成signed型长 数据):增长的位全部扩展为原符号位(正数扩展0 ,负数扩展1)。 正数扩展0好理解; 负数1扩展:以字符型变成整型为例,8位二进制 负数的补码为28 - |原数| 1扩展的结果:(28-1)* 28 +(28 - |原数| )= 216 - |原数| 扩展的数 原补码 新补码 b、零扩展:unsigned型短数据变成长数据时。 3、最高位失去符号位功能(signedunsigned)与变 成符号位(unsignedsigned):长度不变,数值可 能改变,以16位整型为例, a、signedunsigned :补码当作正数(原是正数不 变,负数变成216 - |原数| 如有定义unsigned int a;a=-1; 则a的值为65535 b、unsigned signed: 小于32767的数不变 大于32767的数a变成负数b,a即b 的补码: a=216 -|b|=216+b b= -(216 -a) 例如int b;b=65535u;由65535=216-|-1|为-1的补 码,即b的值为-1。 4、丢失精度 a、截去小数:实数整数(降格) b、double型(16位精度)float型(6位精度):降格 (四舍五入) c、long型(可达10位整数)float型(6位精度):提 升(数的范围扩大) 5、截去高位(溢出)产生数值的变化:发生在输入时或 长数据转换成较短的整型数据时 6、给实数赋值,多给有效数字无效: float型:只能接受7位有效数字,多给无效; double型:只能接受16位有效数字,多给无效。 四、程序设计时数据类型的使用原则 1、避免数值发生变化 (1)避免signed型与unsigned型之间的转换; (2)注意计算或输入中数值范围不超过使用类 型数值的范围,否则应定义较高类型。 2、使用数据类型时尽量避免丢失精度:在有 可能丢失精度的情况下应定义较高的类型。 3. 8 算术运算符与算术表达式 3.8.1 C运算符简介 1、运算符:代表对数据的操作。C语言有13 类(P55)共45个运算符(P375附录),比 较多。因此,运算符是学习C语言的重点 和难点之一。 2、表达式,由:运算符+运算对象(常量、 变量、函数调用等)组成。 3、 学习运算符要注意的几个方面: (1)运算符的功能 (2)运算符与运算量的关系 a、要求运算量的个数(单目、双目、三目); b、要求运算量的类型(如求余运算符%要求运算量 是整型); c、结合方向(运算量到运算符):左结合、右结合( 单目、赋值类、条件运算符) (3)运算符的优先级(P375) (4)运算结果的数据类型:不同类型数据运算的类型 转换(上节) 3.8.2算术运算符和算术表达式 1、基本的算术运算符:+、-、*、/、% (1)类型:双目(需要两个操作数),结合方向从左到右 (2)求余运算%:两个操作数均为整数,a%b结果为a除 以b的余数,余数的符号与被除数相同,如:17%-3 的结果为2;-19%4的结果为-3。 其它运算符的两个操作数既可以是整数,也可 以是实数。 (3)优先级:(*、/、%)同级较高,(+、-)同级较低 注意:正负号运算符(+、-)是单目的,与数学中的相 同,右结合,优先级高,不同于加、减运算符。 2、算术表达式:由算术运算符、操作数(常量、变量 、函数调用)和圆括号组成,例如:a*b/c- 1.5+a 3、强制类型转换(又叫显式转换)运算符 (1)形式:(类型)(表达式)/*将表达式的值转换成相应类型*/ 例如:(double)a (int)(x+y) (float)(5%3) (2)注意: a、表达式一定要加括号(因强制类型转换是单目运算,优先 级高) b、若对变量实型显式转换,将得到新类型的一个值,原变 量的类型及其存储值均不变。 例:main( ) float x=3.6; printf(“%d,%fn”, (int)x, x); 运行输出为 3,3.600000 例3.8(P56) 4、自加和自减1运算符:+、- 注意:由两个符号组成的运算符之间无空格 (1)类型:单目 (2)优先级:同其它单目运算符,高于*、/、% 等 (3)结合性:右结合性 对于表达式 -i+,由于“-”和“+”优先级 相同,均为右结合性,因此相当于 -(i+) (4)作用:作用于变量,使变量的值自增1或自减1 ,如+i相当于i=i+1;-j相当于j=j-1,因此+、- -实质也有赋值作用。由于不能对常量或表达式赋 值,因此3+, (a+b)-等都是错误的。 (5)前缀运算与后缀运算 a、前缀运算 +i相当于i=i+1且表达式的值与i的值相同(先增值后引用); -j相当于j=j-1且表达式的值与j的值相同。 b、后缀运算 i+先取i的值作为表达式的值,i再自增1(先引用后增值); j-的情况相似。 例如有定义 int i=5, x, y; x=+i,相当于i=i+1,x=i,即先i自增为6,表达式+i的值也为6 ,因此x=6。同样,y=-i,先i自减为4,表达式-i的值也为4 ,因此y=4 x=i+,相当于x=i,i=i+1,即先取i的值5作为i+的值赋给x, x=5,然后i自增为6。同样,y=i-,先取i的值5作为i-的值 赋给y,y=5,然后i自减为4 5、表达式使用中的若干问题(Turbo C和MS C的规定) (1)连续自增问题,例如: int i=3;(i+)+(i+)+(i+)的值为9,i的值为6 /*统一先取值后自增*/ int i=3;(+i)+(+i)+(+i)的值为18,i的值为6 /*先自增后统一取值*/ (2)printf()函数中多输出项计算问题:自右向左运算 例:int i=3;printf(“%d,%dn”,i+2,i+)输出6,3 (3)printf()函数的输出项连续自增问题(不同于(1) : 例:int i=3;printf(“%dn”,(i+)+(i+)+(i+) 输出12 /*分步取值自增*/ int i=3;printf(“%dn”,(+i)+(+i)+(+i) 输出15 /*分步自增取值*/ 3. 9 赋值 运算符和赋值 表达式 1、赋值运算符 = (1)作用:将一个数据赋给一个变量 (2)赋值表达式的形式: 变量=表达式 例如: a=1.0 /* a中存入1.0 */ a=a+3 /*将a中存的1.0与3相加得4.0再存入a中*/ b=a /*将a中存的4.0复制存入变量b中*/ a=a+b /*将a中存的4.0与将b中存的4.0相加得8.0再 存入a中*/ 2、说明: (1)“=”是赋值运算符,不是等于号(等号是 =) (2)赋值运算方向(操作数到操作符)自右向左 (3)赋值运算的过程:先计算表达式,然后将 计算结果转换成变量的类型后存到变量的存 储单元中,该变量原有的值被覆盖。 (4)赋值运算符左边只能是变量,不能是常量 或表达式,如2=a和a+b=c都是错误的。 (5)赋值运算符的优先级较低(只高于逗号运算 符),因此一般情况下表达式无须加括号,如 a=2+7/3将值4赋给变量a (6)赋值运算是一个表达式,其值即赋值后变量的值, 可给其它变量赋值,如: b=(a=3+5) 或b=a=3+5,运算后a和b的值均为8。 d=c=b=a=3+5运算后a、b、c、d的值均为8。 (7)由于自动将表达式的值转换成变量的类型,将会出 现3.7节介绍的问题: P59(2)(4)(6)(7)(8):数据类型提升; P59(1)(3)(5):数据类型降格, 另外(1)(3)还丢失精度,(5)截去高位(溢出); P60(4)(6):符号位扩展 P59(4)(7):零扩展 P61(8)例3.9:最高位失去符号位功能 若unsigned a=65535; int b; b=a; 则65535的最高位 变成符号位,b的值为-1。 3、复合赋值运算符(又叫自反算术运算符, P62):+=、-=、*=、/=、%= (1)类型(赋值类):双目、右结合 (2)产生:由a=a+b 简化成a+=b 同样,c-=d即c=c-d、e*=f即e=e*f、g/=h即 g=g/h、i%=j即i=i%j (3)与赋值运算符同优先级、同结合方向。 例1:若a=3; b=4; c=b*=a+2 求b、c的值 解:根据优先级和结合方向,由于“+”号优先 级高于“*=”和“=”,该表达式相当于 c=(b=b*(a+2),由此算得b=20,c=20。 例2:设有定义int a=9; 计算表达式a+=a-=a+a 解:由于“+”号优先级高于复合赋值运算符, 因此先计算a+a为18,再按自反运算符的右结 合性,计算a-=18,即a=a-18,此时“=”号 右边a的值仍为9,计算结果a被赋予-9,再计 算a+=a,即a=a+a,a最后的值为-18,也即整 个表达式的值为-18。 4、赋值类运算符的副作用及限制 (1)赋值类运算符包括 =、+=、-=、*=、/=、%=、+、

温馨提示

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

评论

0/150

提交评论