C语言第二章数据、运算.ppt_第1页
C语言第二章数据、运算.ppt_第2页
C语言第二章数据、运算.ppt_第3页
C语言第二章数据、运算.ppt_第4页
C语言第二章数据、运算.ppt_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

Dalian University of Technology 第二章 数据、运算符和表达式 Dalian University of Technology 常量、变量以及函数等都是程序的基本操作对 象,统称为数据。根据数据的取值范围以及能在其 上所进行的运算,可把数据分为各种类型,不同类 型的数据一般在内存中占用不同的存储空间,同时 ,数据的类型不同,能够参加的运算也不同。语 言中的数据类型非常丰富,大体上可划分为基本的 数据类型和导出的数据类型两种,基本数据类型主 要包括整型、字符型和单双精度浮点型等;导出数 据类型是在基本数据类型的基础上产生的,其中包 括数组、结构等。 Dalian University of Technology 本章主要讨论语言中的一些基本概念,如变 量、标识符等,同时详细说明语言中的几种基本 数据类型、算术运算符、关系运算符、逻辑运算符 以及利用这些运算符来构成相应表达式的一些规则 。 Dalian University of Technology 2.1 基本概念 2.1.1 标识标识符 标识符:是指用来标识程序中用到变量名、函 数名、类型名、数组名、文件名以及符号常量 名等的有效字符序列。 Dalian University of Technology 在语言中,标识符的命名规则是:由字母 (大、小写皆可)、数字及下划线组成,且第一 个字符必须是字母或下划线。 Dalian University of Technology 合法的标识标识符名: year,Day,ATOK,x1,_CWS,_change_to 不合法的标识标识符名: #123,.COM,$100,1996Y, 1_2_3 Dalian University of Technology 在语言中,大写字母和小写字母是有区别的 ,即作为不同的字母来看待。如标识符RAN、Ran和 ran分别表示三个不同的标识符,这一点同其它高级 语言是有区别的,应引起注意。 Dalian University of Technology 2.1.2 常量 常量:又称常数,是指在程序运行过程中其值不能 被改变的量。常量也分为不同的类型,这是由常量 本身隐含决定的。 符号常量:为了增加程序的可读性,可以用一个名 字(字符序列)来代表一个常量,此时的常量被称 为符号常量。 Dalian University of Technology 2.1.3 变变量 变量:是指在程序运行过程中其值可以被改变的量。 变量被区分为不同的类型,不同类型的变量在内存中 占用不同的存储单元,以便用来存放相应变量的值。 Dalian University of Technology 组成变量名(标识符)的有效字符数随语言 的编译系统而定。有的编译系统允许使用长达31 个字符的变量名,而有的编译系统只取变量名的 前8个字符作为有效字符,后面的字符无效,不被 识别,这样,只要变量名的前8个字符相同,就被 认为是同一个变量。因此,在进行程序设计之前 ,应首先了解所使用的编译系统中对变量名长度 的规定,以免造成变量使用上的混乱。 Dalian University of Technology 2.1.4 关键键字 关键字:又被称为保留字或保留关键字,也是 语言中的一种标识符,它被用来命名语言 程序中的语句、数据类型和变量属性等。 Dalian University of Technology 作用:被用来命名语言程序中的语句、数据类型 和变量属性等。每个关键字都有固定的含义,不能 另作其它用途。 注意:语语言中的所 有关键键字都是用小写 字母来表示的。 Dalian University of Technology 2.2 基本数据类类型 在语言中,最基本的数据类型只有四种,它 们分别由如下标识符进行定义: int 整型 char 字符型 float 单精度浮点型 double 双精度浮点型 Dalian University of Technology 语言规定,对程序中用到的所有变量,都必 须先定义后使用,每个变量只能与一种数据类型相 联系。在定义变量时,不能把语言中具有固定含 义的关键字(如int、char等)作为变量名,同时 ,同一个函数内所定义的变量不能同名。 Dalian University of Technology 2.2.1 整型变变量及其常量 1. 整型变变量 整型变量:可用来存放整型数据(即不带小数点的数)。 其定义方式如下所示: int i1,i2; 其中i1和i2即被定 义为整型变量。 Dalian University of Technology 2. 整型常量 在语语言中,整型常量可以用三种数制来 表示: Dalian University of Technology (1) 十进制整型常量:如250,-12等 ,其每个数字位可以是09。 Dalian University of Technology (2) 十六进制整型常量:如果整型常量 以0x或0X开头,那么这就是用十六进制形式 表示的整型常量。例如,十进制数的128, 用十六进制表示为0x80或0X80,其每个数字 位可以是09、AF。 Dalian University of Technology (3) 八进制整型常量:如果整型常量的最 高位为0,那么它就是以八进制形式表示的整型 常量。例如,十进制数的128,用八进制表示为 0200。需要注意的是,八进制数中的每个数字 位必须是07。 Dalian University of Technology 2.2.2 浮点型变量及其常量 1. 浮点型变量 在语言中,把带有小数点的数称为浮点数 ,也可以称为实型数。 浮点型变量又被称为实型变量,按其能够表 示的数的精度,又被分为单精度浮点型变量和双 精度浮点型变量。 Dalian University of Technology 单精度浮点型变量的定义方式如下所示: 双精度浮点型变量的定义方式如下所示: float f1,f2; 其中f1和f2即被定义为单 精度浮点型变量。 double d1,d2; 其中d1和d2即被定义为 双精度浮点型变量。 Dalian University of Technology 单精度浮点型变量和双精度浮点型变量之间的 差异,仅仅体现在所能表示的数据的精度上,如果 单精度浮点型所提供的精度不能满足要求时,则可 以考虑使用双精度浮点型。 在不同的系统中,float型数据和double型数据 所能提供的精度是有差异的,一般来讲,在同一个 系统中,double型变量值的最大有效位数,通常是 float型的两倍。 Dalian University of Technology 2. 浮点型常量 浮点型常量一般不分float型和double型,任何 一个浮点型常量,既可以赋给float型变量,也可以 赋给double型变量,但由于float型变量和double型 变量所能表示的数的精度不同,所以,在赋值时, 将根据变量的类型来截取相应的有效位数。 Dalian University of Technology 浮点型常量有如下两种表示形式: (1) 十进制数形式:它是由数字和小数点 组成的,例如,3.14159,-7.2,9.8等都是用 十进制数的形式表示的浮点数。 Dalian University of Technology (2) 指数法形式:指数法又称为科学记数法, 它是为方便计算机对浮点数的处理而提出的。例如 ,十进制数的180000.0,用指数法可表示为1.8e5, 其中1.8被称为尾数,5被称为指数,字母e也可以用 E来表示。又如,0.00123可表示为1.23E-3。需要注 意的是,用指数形式来表示浮点数时,字母e或E之 前(即尾数部分)必须有数字,且e后面的指数部分 必须是整数,例如,e-3,9.8e2.1,e5,.e3,e等都 是不合法的指数表示形式。 Dalian University of Technology 2.2.3 字符型变量及其常量 1. 字符型变量 char c1,c2; 字符型变量用于存放一个单个字符。它的 定义方式如下所示: 其中c1和c2即 被定义为字符 型变量。 Dalian University of Technology 2. 字符型常量 字符型常量是由一对单引号括起来的一个字符 ,例如,A,*和8等都是合法的字符型常量。 Dalian University of Technology 在语言中,还允许使用一些特殊形式的字符 型常量,这些字符型常量都是以反斜线字符开头 的字符序列(又称为转义字符)。常用的以字符 开头的特殊字符: n: 换行字符(回车换行) r: 回车字符(光标返回本行第一列,但不删字符) b: 退格字符(后退一列,但不删字符) t: 制表字符(横向跳格,输出8个空格) : 单引号字符 “: 双引号字符 : 代表一个反斜线字符 Dalian University of Technology 除了上述具有特殊意义的字符外,语言还允 许在字符后面紧跟13位八进制数或在x后面 紧跟12位十六进制数来表示相应系统中所使用的 字符的编码值。使用这种表示方法,可以表示字符 集中的任一字符,包括某些难以输入和显示的“控 制字符”,ASCII码表中编码值小于0x20的字符就属 于这一类字符。例如,响铃字符(bell),在ASCII 码表中的编码值为7,在程序处理过程中,为了发出 响铃声音,可通过显示7(07或007)码来 获得响铃效果。 Dalian University of Technology 需要注意的是,上面介绍的由开头的 特殊字符,仅代表一个单个字符,而不代表 多个字符,它仅代表相应系统中的一个编码 值。 Dalian University of Technology 3. 字符串常量 字符串常量:是由一对双引号括起来的字符序列。 从表面上看,“string“是由6个字符组组成的,但 实际实际上它是由7个字符组组成的,这这是因为为在语语言中 ,系统统自动动地在每个由双引号括起来的字符串的最 后补补上0字符,即ASCII码值为码值为0的字符。因此, 语语言中的每个字符串都是以0为结为结束标标志的。 例如“string“ Dalian University of Technology 需要注意的是,不能将字符串常量赋给一个字符 型变量,如果要保存字符串常量的话,需要使用以后 介绍的字符数组来存放。 Dalian University of Technology 2.2.4 长整型、短整型和无符号整型 上面已经介绍了四种基本数据类型,它们是int、 char、float和double。语言在int型的基础上又发展 了三种基本数据类型,它们是长整型、短整型和无符号 整型,分别用long int、short int和unsigned int来表 示。同时还有unsigned short和unsigned long类型。 Dalian University of Technology 1. 长整型 长整型变量的定义方式如下所示: long int lv; 其中lv是长整 型变量,关键 字int可以省略 。 Dalian University of Technology 使用长整型变量的目的是为了存放比较大的整数 。长整型变量能够表示的数值范围与计算机系统有关 ,一般是int型变量有效位数的两倍,int变量如果占 两个字节,则long int变量可能占4个字节,这样,长 整型变量所能表示的数值范围,将远远超过一般整型 变量所能表示的范围。 Dalian University of Technology 在整型常量的末尾加上字母L或l,就 构成了长整型常量。这种写法往往用在函 数实参中(如果函数的形参为long int,则要求实参也为long int,此时用123作参数不行,而要用123L作参数)。 可将987654写成987654L或987654l。 例如 Dalian University of Technology 2. 短整型 短整型变量的定义方式如下所示: short int sv; 其中sv是短整 型变量,关键 字int可以省略 。 Dalian University of Technology 短整型变量用于存放比较小的整型数,使用短整 型的目的是为了节省计算机的内存空间,但一个短整 型变量所占的内存字节数与相应的系统有关,在有的 计算机系统中,短整型变量所占用的存储空间少于整 型变量所占用的存储空间,但在有的系统中,short int变量和int变量占用相同的内存空间。 Dalian University of Technology 短整型常量与一般的整型常量没有明显的区别, 其区别仅仅在于所能表示的数值大小而已。在有的PC 机上,短整型变量和整型变量都占用两个字节的内存 空间,因此,所能表示的数值大小也完全一样,即- 3276832767之间。 要将123赋给短整型变量sv,则需要使用如下语句: sv=123; 例如 Dalian University of Technology 3. 无符号整型 无符号整型变量的定义方式如下所示: unsigned int uv; 其中uv是无符 号整型变量, 关键字int可以 省略。 一个整型常量后面加字母U或u, 就被认为是unsigned int 型, 如12345u在内存中按unsigned int 规定的方式存放(最高位不 作为符号位,而用来存储数据) ,如果写成-12345u,则将其转 换为补码存储。 Dalian University of Technology 无符号整型变量主要用于存放非负整型数,由 于这种变量与int型变量占用相同的内存空间,因此 ,它能够存放的正整数范围将大于int型变量所能存 放的正整数范围。 无符号整型常量总是大于等于0的正整数。在有 的PC机上,无符号整型常量的数值范围一般为0 65535之间。例如,要将100赋给无符号整型变量uv ,则需要使用如下语句: uv=100; Dalian University of Technology 2.2.5 类型定义typedef 语言提供了许多标准类型名,如上面介绍 的int、char和float等,用户可以直接使用这些 类型名来定义所需要的变量。同时,语言还允 许使用typedef语句来定义新的类型名,以取代已 有的类型名。 Dalian University of Technology 例如: typedef int counter; 其作用是定义counter来等价于基本 数据类型名int,以后,就可以利用 counter来定义int型变量了。 Dalian University of Technology 例如: counter i,n; 使用类型定义的优点是能够增加程序的 可读性。由上述语句可以看出,当用counter 来定义i、n变量时,就可以判断出i、n变量的 作用可能是当计数器使用,但如果用int来定 义的话,就难以看出这种用途。 其等价于: int i,n; Dalian University of Technology 使用typedef语句需要注意如下几个问题: (1) typedef语句不能创造新的类型,只能为 已有的类型增加一个类型名,这也就是说原有的类 型名仍然可以使用。 (2) typedef语句只能用来定义类型名,而不能 用来定义变量。 Dalian University of Technology 2.3 算术运算符、赋值运算符及其表达式 语言的运算符很多,本节主要介绍算术运算符 、赋值运算符及其相应的表达式。 Dalian University of Technology 2.3.1 算术运算符和算术表达式 1. 加、减、乘、除及取模运算符 语言中的加、减、乘、除及取模运算 符分别由+、-、*、/及%来表示。 21%7的结果是0, 21%5的结果为1。 -100(表示负100); 其中减法运算符也 可以作为负值运算 符使用 取模运算符又被称为求余运 算符,要求%的两侧必须为 整型数,它的作用是取两个 整型数相除的余数。 Dalian University of Technology 优先级: 一个表达式中如果有多个运算符,则计算是有先 后次序的,这种计算的先后次序被称为相应运算符的 优先级。 *、/、%运算符的优先级高于+、-运算符的优先级。 Dalian University of Technology 结合性: 除了优先级以外,语言中还规定了相 应运算符的结合性。所谓结合性,是指当一 个运算对象(操作数)两侧的运算符的优先 级相同时,进行运算(处理)的结合方向。 在表达式求值时,先按运算符的优先级别高低次序执行,例如 a-b*c,先乘除后加减。如果在一个运算对象两侧的运算符的 优先级相同,如a-b+c,则需要按规定的“结合方向”处理, 由于算术运算符的结合方向为“自左至右”,即先左后右( 即左结合性),因此,b先与减号结合,执行a-b运算,再执 行加c的运算。有些运算符的结合方向是“自右至左”,即 右结合性(如赋值运算符),详见附录。 Dalian University of Technology 说明 在语言中,算术运算符的结合方向为自左至 右,即运算对象先与左面的运算符结合,而有的运 算符的结合方向是自右至左。例如,赋值运算符。 语言对运算符的优先级及其结合性的规定是 比较复杂的,初学者往往会感到不适应,附录中列 出了每个运算符的优先级及其结合性。 Dalian University of Technology 算术表达式 由算术运算符和圆括号将运算对象连接起来的 有意义的式子被称为算术表达式。在表达式中,使 用左、右圆括号可以改变运算的处理顺序,由于圆 括号的优先级最高,因此,圆括号里的运算总是最 先进行的。 例如: x=a*(b+c); 注意:先计算括号里b+c 的值,然后乘以a,并把结 果赋给变量x。 Dalian University of Technology 2. 增1、减1运算符 增1、减1运算符是语言特有的运算效率较高的 运算符。 增1运算符+和减1运算符-是两个单目(只有一 个运算对象)运算符,它们的运算对象只能是整型或 字符型变量,而不能是浮点型变量。增1运算符是将 运算对象的值增1;减1运算符是将运算对象的值减1 。它们既可以作前缀运算符(位于运算对象的前面), 也可以作后缀运算符(位于运算对象的后面)。 Dalian University of Technology 例如: 尽管+n和n+都使n的值值自增1,但其结结果是有 区别别的:+n表示在用该该表达式的值值之前使n的值值增1 ;n+表示在用该该表达式的值值之后使n的值值增1。同样样 ,-n表示在用该该表达式的值值之前使n的值值减1;n-表 示在用该该表达式的值值之后使n的值值减1。因此,在使用 增1和减1运算符时时,必须须要注意变变量的值值和表达式的 值值在程序上下文中的效果。 作前缀运算符+n,-m 作后缀运算符n+,m- Dalian University of Technology 例如: x=n-; x=n; n=n-1; 相当于 x=-n; n=n-1; x=n; 相当于 显然,对于变量n来讲,上述两个 语句的结果是一样的,都使n的值 减1,而对于x的值来讲就不同了 ,要引起注意。 Dalian University of Technology 注意: 使用增1、减1运算符进行运算时,注意两个问 题:一是增1、减1运算符只适用于变量,而不能用 于常量或表达式,如-5和(i+j)+等都是非法的; 二是在只需对变量本身进行增1或减1操作而不关心 整个表达式的值的情况下,前缀运算和后缀运算的 效果完全相同。 合理地使用增1、减1运算符,对于编写高质量 的语言程序是非常有用的,它的简洁表示形式, 对于以后要介绍的结构控制语句以及指针运算等都 将带来很大的方便。 优优先级顺级顺序如下(由高到低): -(负负号)、+、- 高于*、/、% 高于 +、- Dalian University of Technology -(取负)、+和-的结合方向为右结合,+-*/和%的结合 方向为左结合。当运算符+、-和运算符+、-进行混合运算时 ,C语言规定,自左至右尽可能多的将若干字符组成一个运算符 。例如(假如i=2,j=3) (1)i+j等价于(i+)+j 计算后表达式值=5,i=3,j=3 (2)-i+等价于-(i+) 计算后表达式值=-2,i=3,j=3 -i+j等价于-(i+)+j 计算后表达式值=1,i=3,j=3 下面的运算是错误的: +i+j; +i+; (-i)+; Dalian University of Technology 2.3.2 赋值运算符和赋值表达式 语言的赋值运算符是“”,它的作用是将赋 值运算符右边的表达式(包括算数表达式、关系表 达式和逻缉表达式)的值赋给其左边的变量。 例如:x=a+b的作用是将a+b的结结果赋给变赋给变量x。 Dalian University of Technology 为为了简简化程序并提高编译编译效率,语语言允许许在赋值赋值运算符 “=”之前加上其它运算符,以构成复合赋值赋值运算符。 例如: 可以写成 x+=5x=x+5 可以写成 x=x*(y+1)x*=y+1 Dalian University of Technology 凡是二元(有两个运算对对象)运算符,一般都可以 与赋值赋值运算符一起组组成复合的赋值赋值运算符。 +=,-=,*=,/=,%= 例如: 都是合法的复合 赋值运算符。 Dalian University of Technology 2.4 关系运算符、逻辑运算符及其表达式 2.4.1 关系运算符和关系表达式 关系运算是逻辑运算的一种简单形式,主要用 于比较操作。 Dalian University of Technology 1. 关系运算符 大于 = 大于等于 = 等于 != 不等于 Dalian University of Technology 注意:不要把关系运算符的“=”和赋值运算符的 “=”搞混淆了。“=”是关系运算符,仅用于比较 操作,而没有赋值运算,而“=”是赋值运算符,它 主要进行赋值操作。 由附录可知,关系运算符的优先级低于算术运 算符的优先级,且上述后两种关系运算符(=和!= )的优先级低于前四种关系运算符的优先级。 Dalian University of Technology 2. 关系表达式 由关系运算符将两个表达式连接起来的有意义的 式子称为关系表达式。 例如: xy, a+by为为“真”时时,其表达式的值为值为1; 当xy为为“假”时时,其表达式的值为值为0。 Dalian University of Technology 可以将关系表达式的运算结结果(0或1)赋给赋给一个 整型变变量或字符型变变量。 例如: c=ab; 当a=4,b=1时,上面的赋值 语句是将1赋给变量c: Dalian University of Technology 2.4.2 逻辑逻辑运算符和逻辑逻辑表达式 为了表示比较复杂的条件,需要将若干个关系 表达式组合起来判断,语言提供的逻辑运算就是 用于实现这一目的的。 Dalian University of Technology 1. 逻辑逻辑运算符 语语言中提供了如下三种逻辑逻辑运算符: 它表示定义整型变 量age,同时将初值 20赋给它 Dalian University of Technology 初始化方式 char letter=A; int convert=b-B; float average=3.2*9.8; Dalian University of Technology x、y、z三个整型变量都赋以初值10: 同时定义的多个变量的一部分赋初值: int x=10,y=10,z=10; float px, py, pi=3.1416; 它表示px、py、pi都是浮点型变量,但只对 变量pi赋以初值3.1416,而其余的变量(px和 py)没有被显式地赋以初值。 Dalian University of Technology 2.6 不同类型数据之间的转换 在内存中,字符是以系统中所使用的字符的编码 值形式存储的,比如,在有的PC机上是以ASCII码形 式存储的,它的存储形式与整型数的存储形式相似。 语言允许字符型数据和整型数据之间通用:一个字 符型数据,既可以以字符形式输出,也可以以整数形 式输出(有关输入输出部分将在以后介绍),同时 ,字符型数据可以赋给整型变量,整型数据也可以赋 给字符型变量,只是当整型数据的大小超过字符型变 量的表示范围时,需要截取相应的有效位数。 Dalian University of Technology 除了上述字符型数据和整型数据之间可以通用之 外,不同类型的数据在进行混合运算时,往往需要进 行类型转换。这种类型转换有两种方式:一种是自动 类型转换,另一种是强制类型转换。 Dalian University of Technology 2.6.1 自动类型转换 语言允许整型、单精度浮点型和双精度浮点型数 据之间进行混合运算,由于字符型数据可以和整型数 据通用,所以,下列表达式是合法的: B+3.14*560-92 自动类动类型转换转换的顺顺序如下: double unsigned long int int float unsigned char,char,unsigned short,short 说明: float型先转换为double型后运算,即 使两个float运算也是先转化。 char和short型先转换为int型后运算 其他由低向高转换。 unsigned int long int 转换转换方向(不是转换转换步骤骤) Dalian University of Technology 整型数据和浮点型数据之间的自动转换规则: (1) 当单、双精度浮点型数据赋给整型变量时,浮 点数的小数部分将被舍弃。同时,由于浮点型变量所 能表示的数的范围远远超过整型变量的表示范围,所 以,在赋值时,还需进行相应有效位数的截取操作。 (2) 当整型数据赋给浮点型变量时,在数值上不发 生任何变化,但整型数据将被转换成浮点型数据的形 式后,存储到浮点型变量中。 Dalian University of Technology (3) 如果某个算术运算符的两个运算对象都是整数 ,那么,运算将按照整型数的运算规则来进行,这就 意味着对除法运算来讲,其结果的小数部分将被舍弃 。需要注意是,在这种情况下,即使运算结果赋给了 浮点型变量也是一样的,结果的小数部分也将被舍弃 。 float f; int i=4; f=10/i; 例如: 此时,f的结果为 2.0,而不是2.5。 Dalian University of Technology (4) 只要某个算术运算符的两个运算对象中有一个 是浮点型数据,则运算将按照浮点数的运算规则来进 行,即结果的小数部分也被保留下来。 float f int i=4; f=10.0/i 例如: 此时,f的结 果为2.5,而不 是2.0。 Dalian University of Technology 2.6.2 强制类型转换 当自动类型转换达不到目的时,可以利用强制类 型转换。 当除法运算符“/”的两个运算对象都是整型数据 时,其运算将按照整型运算规则来进行,即舍弃结果 的小数部分,如果希望按照浮点型运算规则来运算的 话,就必须首先把其中某个运算对象的数据类型强制 转换为浮点型,然后再进行运算。 例如: Dalian University of Technology 强制类型转换的一般形式如下所示: (类型名)(表达式) Dalian University of Technology 例如 (float)x/y是将x强制转换成float型后,再进行运算。 (int)(x+y)是将x+y的结果强制转换成int型。 Dalian University of Technology

温馨提示

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

评论

0/150

提交评论