《函数和作用域》ppt课件_第1页
《函数和作用域》ppt课件_第2页
《函数和作用域》ppt课件_第3页
《函数和作用域》ppt课件_第4页
《函数和作用域》ppt课件_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章第四章 函数和作用域函数和作用域 函数的定义和阐明函数的定义和阐明 函数的调用函数的调用 函数的参数函数的参数 内联函数内联函数 函数重载函数重载 函数的嵌套调用和递归调用函数的嵌套调用和递归调用 作用域作用域 C+C+的系统函数的系统函数4.1 4.1 函数的定义和阐函数的定义和阐明明一、函数的定义一、函数的定义 函数前往值的函数前往值的类型类型4.1 4.1 函数的定义和阐函数的定义和阐明明一、函数的定义一、函数的定义 函数的标识函数的标识4.1 4.1 函数的定义和阐函数的定义和阐明明一、函数的定义一、函数的定义包括参数名和参数类型无形参时,括号不可省包括参数名和参数类型无形参时,

2、括号不可省 函数调用时的函数调用时的方式参数方式参数4.1 4.1 函数的定义和阐函数的定义和阐明明一、函数的定义一、函数的定义 函数的详细实现函数的详细实现例:例: int add( int x, int y ) int z; z=x+y; return z; void nothing( ) 二、函数的阐明声明二、函数的阐明声明 函数定义在后、调用在先,调用前必需阐明;函数定义在后、调用在先,调用前必需阐明; 函数定义在先、调用在后,可以不加阐明;函数定义在先、调用在后,可以不加阐明; 复杂调用中,常在程序头对一切被调用函数复杂调用中,常在程序头对一切被调用函数 一次性阐明。一次性阐明。 (

3、) ;例:例:int add(int x, int y);原型阐明原型阐明例例4.2 #include void fun1( ), fun2( ), fun3( ); void main( ) cout“It is in main.endl; fun2( ); cout“It is back in main.endl; void fun1( ) cout“It is in fun1.endl; fun3( ); cout“It is back in fun1.endl; void fun2( ) cout“It is in fun2.endl; fun1( ); cout“It is back

4、 in fun2.endl; void fun3( ) cout“It is in fun3.endl; 4.2 4.2 函数的调用函数的调用()void main( ) int a=3; int b=5; int c=add(a,b); /实参与形参个数相等,类型一样实参与形参个数相等,类型一样实参实参 函数调用表达式的值是函数的前往值函数调用表达式的值是函数的前往值; 函数调用表达式的类型是函数的类型;函数调用表达式的类型是函数的类型;v 函数调用经过一个表达式实现:函数调用经过一个表达式实现: return ; 或或 return;v 函数的前往值经过前往语句实现函数的前往值经过前往语句

5、实现的值作为函数的前往值;的值作为函数的前往值;的类型自动转换为函数类型;的类型自动转换为函数类型;程序执行的控制权转向调用函数;程序执行的控制权转向调用函数;注:无前往值的函数用注:无前往值的函数用“void阐明类型!阐明类型!一、函数的传值调用一、函数的传值调用1. 传值调用传值调用 将实参值拷贝一个副本给对应的形参将实参值拷贝一个副本给对应的形参; 形参值的改动不影响实参!形参值的改动不影响实参!实参:常量、变量值或表达式值实参:常量、变量值或表达式值形参:变量形参:变量变量的两种值:变量本身值和变量地址值;变量的两种值:变量本身值和变量地址值;传值调用分为:传值调用和传址调用;传值调用

6、分为:传值调用和传址调用;例例4.3 #include void swap1(int x, int y) int temp; temp=x; x=y; y=temp; /形参值交换形参值交换 cout“x=x“y=yendl; void main( ) int a(5), b(9); swap1(a, b); cout“a=a“b=bendl; a=5, b=9x=9, y=5 将实参的地址值赋给对应的形参指针,使将实参的地址值赋给对应的形参指针,使形参指针指向实参;形参指针指向实参; 经过改动形参所指向的变量值来影响实参!经过改动形参所指向的变量值来影响实参!实参:地址值指针实参:地址值指针

7、形参:指针形参:指针 2. 传址调用传址调用一、函数的传值调用一、函数的传值调用 1. 传值调用传值调用例例4.4 #include void swap2(int *x, int *y) int temp; temp=*x; *x=*y; *y=temp; /形参指针所指向的变量值交换形参指针所指向的变量值交换 cout“x=*x“y=*yendl; void main( ) int a(5), b(9); swap2(&a, &b); cout“a=a“b=bendl; a=9, b=5x=9, y=5二、函数的援用调用二、函数的援用调用 /C+特征特征 将实参变量名赋给对应

8、的形参援用,相当于将实参变量名赋给对应的形参援用,相当于在被调用函数中运用了实参的别名在被调用函数中运用了实参的别名; 经过改动援用来直接改动对应的实参值经过改动援用来直接改动对应的实参值; 援用调用比传址调用更直接。援用调用比传址调用更直接。形参:援用形参:援用实参:变量名实参:变量名q 援用是变量的别名援用是变量的别名q 对援用的操作就是对被援用的变量的操作对援用的操作就是对被援用的变量的操作例例4.5 #include void swap3(int &x, int &y) int temp; temp=x; x=y; y=temp; /形参援用值交换形参援用值交换 cou

9、t“x=x“y=yendl; void main( ) int a(5), b(9); swap3(a, b); cout“a=a“b=bendl; a=9, b=5x=9, y=5形参形参:援用援用实参实参:变量变量4.3 4.3 函数的参数函数的参数一、函数参数的求值顺序一、函数参数的求值顺序C+没有规定函数调用时实参的求值顺序,没有规定函数调用时实参的求值顺序,各编译器自行规定;各编译器自行规定;当实参表达式中带有副作用的运算符时,当实参表达式中带有副作用的运算符时,能够产生由于求值顺序不同而呵斥的二义能够产生由于求值顺序不同而呵斥的二义性;性; 例例4.6 #include int a

10、dd(int x, int y) return x+y; void main( ) int x(4), y(6); int z=add(+x, x+y); coutzendl; int t=+x; int z=add(t, x+y);二、设置函数参数的默许值二、设置函数参数的默许值C+允许在函数阐明或定义时为形参指定允许在函数阐明或定义时为形参指定默许值;默许值;按从右至左的顺序设置参数的默许值;按从右至左的顺序设置参数的默许值;函数调用,实参与形参结合时:函数调用,实参与形参结合时:假设实参数目缺乏,那么运用形参默许假设实参数目缺乏,那么运用形参默许值;值;假设给定实参值,那么运用给定的实参

11、假设给定实参值,那么运用给定的实参值。值。例例4.7 #include void fun(int a=1, int b=3, int c=5) couta=a,b=b,c=cendl; void main( ) fun( ); fun(7); fun(7, 9); fun(7, 9, 11);a=1, b=3, c=5a=7, b=3, c=5a=7, b=9, c=5a=7, b=9, c=11默许值默许值函数定义函数定义例例4.8#include int m(8); int add_int(int x, int y=7, int z=m); void main( ) int a(5), b

12、(15), c(20); int s=add_int(a, b); coutsendl; int add_int(int x, int y, int z) return x+y+z; 函数声明函数声明函数定义函数定义28 按自右至左的顺序设置参数的默许值;按自右至左的顺序设置参数的默许值; 默许参数在函数声明中提供;默许参数在函数声明中提供; 既有函数声明又有函数定义时,定义既有函数声明又有函数定义时,定义中不允许默许参数;中不允许默许参数; 例例4.8 假设只需函数定义,默许参数才可以假设只需函数定义,默许参数才可以出如今函数定义中。出如今函数定义中。 例例4.7v 设置参数默许值应留意的问

13、题:设置参数默许值应留意的问题: 三、运用数组作函数参数三、运用数组作函数参数 1. 形参和实参都用数组形参和实参都用数组 #includeint a8=1, 3, 5, 7, 9, 11, 13;void fun(int b , int n) for( int i=0; in-1; i+ ) b7+=bi; void main( ) int m=8; funa, m; couta7endl;例例4.949实参实参形参形参 2. 形参和实参都用指针形参和实参都用指针#includeint a8=1, 3, 5, 7, 9, 11, 13;void fun(int *pa, int n) /指针

14、指针pa指向实参数组指向实参数组 for(int i=0; in-1; i+) *(pa+7)+=*(pa+i);void main() int m=8; funa, m; couta7endl;例例4.1049实参实参 3. 实参用数组名形参用援用实参用数组名形参用援用#includetypedef int array8;/ int a8=1, 3, 5, 7, 9, 11, 13;array a=1, 3, 5, 7, 9, 11, 13;void fun(array &b, int n) /为实参数组起别名为实参数组起别名b for(int i=0; in-1; i+) b7+=

15、bi; /对对b操作即对实参数组操作操作即对实参数组操作void main( ) int m=8; funa, m; couta7endl;例例4.1149实参实参4.4 4.4 内联函数内联函数一、内联函数的引入一、内联函数的引入引入内联函数是为理处理函数调用时的引入内联函数是为理处理函数调用时的效率问题;效率问题;编译时,用内联函数的函数体交换内联编译时,用内联函数的函数体交换内联函数的调用表达式普通函数在运转时函数的调用表达式普通函数在运转时被调用;被调用;内联函数是以目的代码的添加为代价来内联函数是以目的代码的添加为代价来换取时间的节省。换取时间的节省。二、内联函数的定义二、内联函数的

16、定义 inline () #include inline int power(int x) return (x)*(x); void main( ) for(int i=1; i=10; i+) int p=power(i); couti“*i“=pendl; 例例4.12 内联函数的定义必需出如今内联函数内联函数的定义必需出如今内联函数第一次被调用前;第一次被调用前; 内联函数体内不允许用循环语句和开内联函数体内不允许用循环语句和开关语句;关语句; 类构造中一切在类阐明内部定义的函类构造中一切在类阐明内部定义的函数都是内联函数。数都是内联函数。v 运用内联函数时应留意:运用内联函数时应留意:

17、4.5 4.5 函数重载函数重载 函数重载是指同一函数名对应多个函数函数重载是指同一函数名对应多个函数实现;实现; 函数重载时,要求同名函数在参数个数函数重载时,要求同名函数在参数个数上不同,或参数类型上不同;上不同,或参数类型上不同; 函数调用时,系统根据调用函数的实参函数调用时,系统根据调用函数的实参情况选择某个函数实现。情况选择某个函数实现。一、参数类型不同的函数重载一、参数类型不同的函数重载 #include int add(int, int); double add(double, double); void main( ) coutadd(5, 10)endl; coutadd(5

18、.0, 10.5)endl; int add(int x, int y) return x+y; double add(double a, double b) return a+b; 例例4.13二、参数个数不同的函数重载二、参数个数不同的函数重载 #include int min(int a, int b) return ab? a:b; int min(int a, int b, int c) int t=min(a, b); return min(t, c); void main( ) coutmin(5, 4, 9)endl; coutmin(-2, 0)endl; 例例4.144.6

19、 4.6 函数的嵌套和递归函数的嵌套和递归调用调用一、函数的嵌套调用一、函数的嵌套调用 main函数函数调用调用a函数函数终了终了 b函数函数 a函数函数调用调用b函数函数q 在调用一个函数的过程中,又调用另一个函数在调用一个函数的过程中,又调用另一个函数例例4.15#includeconst int k=4, n=6;int sum(int k,int n), powers(int m,int n);void main( ) coutsum(k, n)endl;int sum(int k, int n) /求求n个数的个数的k次幂之和次幂之和 for(int i=1,sum=0; i=n;

20、i+) sum+=powers(i,k); return sum;int powers(int i, int k) /求求i的的k次幂次幂 for(int j=1,p=1; j=k; j+) p*=i; return p;二、函数的递归调用二、函数的递归调用调用一个函数的过程中又直接或间接地调调用一个函数的过程中又直接或间接地调用该函数本身;用该函数本身;1. 含义含义2. 特点特点每次分解出的新问题是原问题的简化的每次分解出的新问题是原问题的简化的子问题;子问题;最终分解出的新问题是一个知解;最终分解出的新问题是一个知解;程序简约明晰,可读性强;程序简约明晰,可读性强;3. 过程过程q 回归

21、:从知条件出发,逐一求值回归,回归:从知条件出发,逐一求值回归,q 最终达递推开场处;最终达递推开场处;q 递推:原问题不断分解为新的子问题,递推:原问题不断分解为新的子问题,q 最终达递归终了条件最终达递归终了条件( (知知) );0!=1(知知)3!=3*2!2!=2*1!1!=1*0!递推递推递推递推递推递推1!=1*1=12!=2*1!=2*1=23!=3*2!=3*2=6回归回归回归回归回归回归例:例:例例4.16 #include long int fac(int n); void main( ) int n; coutn; long fa=fac(n); coutn!=faend

22、l; long int fac(int n) long int p; if(n=0) p=1; else p=n*fac(n-1); return p; 例例4.17 #include const int N=8; long fibo(int n); void main( ) long f=fibo(N); coutfendl; long fibo(int n) if(n=1) return 0; else if(n=2) return 1; else return fibo(n-1)+fibo(n-2); 4.7 4.7 作用域作用域一、标识符的作用域规那么一、标识符的作用域规那么标识符只能

23、在其阐明或定义的范围内可见,标识符只能在其阐明或定义的范围内可见,在该范围之外不可见!在该范围之外不可见!“可见即可以进展存取或访问;可见即可以进展存取或访问;标识符的阐明和定义不完全一样;标识符的阐明和定义不完全一样;定义一个标识符总是在一定范围内定义的,定义一个标识符总是在一定范围内定义的,作用范围有大有小作用范围有大有小 ;二、作用域的种类二、作用域的种类1. 程序级工程级最大程序级工程级最大作用域:组成程序的一切文件;作用域:组成程序的一切文件;包括:外部变量和外部函数;包括:外部变量和外部函数;2. 文件级文件级作用域:定义该标识符的文件内;作用域:定义该标识符的文件内;包括:外部静

24、态类变量和内部函数;包括:外部静态类变量和内部函数;3. 函数级函数级作用域:定义该标识符的函数体内;作用域:定义该标识符的函数体内;包括:函数形参、函数内的自动类变量、包括:函数形参、函数内的自动类变量、内部静态类变量、语句标号;内部静态类变量、语句标号;4. 块级最小块级最小定义在分程序中、定义在分程序中、if语句、语句、switch语句中语句中以及循环体中的自动类变量和内部静态以及循环体中的自动类变量和内部静态类变量。类变量。二、作用域的种类二、作用域的种类三、重新定义标识符作用域三、重新定义标识符作用域1. 在标识符作用域的某个子范围内可以重新在标识符作用域的某个子范围内可以重新定义该

25、标识符!定义该标识符! void fun( ) int a; /函数体内函数体内 float a; /分程序内分程序内 2. 原定义的标识符在子范围内不可见,但仍原定义的标识符在子范围内不可见,但仍存在暂时被隐藏;存在暂时被隐藏;#includevoid main( ) int a(5), b(7), c(10); couta b cendl; int b(8); float c(8.8); couta b cendl; a=b; int c=b; couta b cendl; couta b cendl; couta b cendl;5 7 105 8 8.88 8 88 8 8.88 7

26、10例例4.18#include void main( ) int x(3); for(; x0; x-) int x(5); /重新定义变量重新定义变量x, 作用域作用域: 块级块级coutx ; coutendlxendl; 5 5 5 0例例4.191. 部分变量部分变量1) 作用域:函数级和块级;作用域:函数级和块级;2) 包括:自动类变量、内部静态变量和函数形参;包括:自动类变量、内部静态变量和函数形参;q 自动类变量自动类变量autoautoq 存放器类变量存放器类变量registerregisterv 内部静态类变量内部静态类变量staticstaticv 定义在函数体内或分程序

27、内,定义时有默许值定义在函数体内或分程序内,定义时有默许值; ;v 生存期长生存期长, ,可见性与存在性不一致可见性与存在性不一致( (作用域外不作用域外不可见但仍存在,回到作用域仍保管原值可见但仍存在,回到作用域仍保管原值););例例4.20#include void other( );void main( ) int a(3); register int b(5); static int c; couta=a,b=b,c=cendl; other( ); other( );void other( ) int a(5); static int b(12); /内部静态类变量内部静态类变量 a

28、+10; b+=20; couta=a,b=bendl; a=3, b=5, c=0 a=5, b=32 a=5, b=522. 全局变量全局变量1) 作用域:程序级和文件级;作用域:程序级和文件级;2) 包括:外部变量和外部静态类变量;包括:外部变量和外部静态类变量;v 外部变量的定义外部变量的定义v 定义在函数体外,定义时不加任何存储类阐定义在函数体外,定义时不加任何存储类阐明;明;v 外部变量的阐明声明外部变量的阐明声明v 用阐明符用阐明符“extern对外部变量进展阐明对外部变量进展阐明v 运用后定义的外部变量,在运用前必需阐明;运用后定义的外部变量,在运用前必需阐明;v 在一个文件中

29、运用另一个文件定义的外部变量,在一个文件中运用另一个文件定义的外部变量,必需阐明;必需阐明;v 一个外部变量只能定义一次,但可以阐明多次。一个外部变量只能定义一次,但可以阐明多次。int add(int a, int b) int s=a+b; return s; void main( ) extern int x, y; /外部变量外部变量阐明阐明 coutadd(x, y)endl; int x(20), y(5); /外部变量外部变量定义定义运用后定义的外部变量运用后定义的外部变量必需提早阐明必需提早阐明例:例:例例4.21#include void fun1( ), fun2( ),

30、fun3( ); /函数阐明函数阐明int i(5); /外部变量:程序级外部变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;文件:文件:main.cpp#includestatic int i; /外部静态变量:文件级外部静态变量:文件级void fun1( ) i=50; coutfun1():i(static)=iendl;1fun1():i(static)=50文件:文件:file1.cpp3) fun2():i(

31、auto)=154) fun2():i(extern)=20#includevoid fun2( ) int i=15; /自动类变量:函数级自动类变量:函数级 coutfun2():i(auto)=iendl; if(i) extern int i; /声明外部变量:程序级声明外部变量:程序级 coutfun2():i(extern)=iendl; extern int i; void fun3( ) i=30; coutfun3():i(extern)=iendl; if(i) int i=10; coutfun3():i(auto)=iendl; 文件:文件:file2.cpp例例4.2

32、1#include void fun1( ),fun2( ),fun3( );int i(5); /外部变量:程序级外部变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl; 2main():i=20文件:文件:main.cpp例例4.21#include void fun1( ),fun2( ),fun3( );int i(5); /外部变量:程序级外部变量:程序级void main( ) i=20; fun1( ); cou

33、tmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;文件:文件:main.cpp例例4.21#include void fun1( ),fun2( ),fun3( );int i(5); /外部变量:程序级外部变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;5main():i=20文件:文件:main.cpp例例4.21#inc

34、lude void fun1( ),fun2( ),fun3( );int i(5); /外部变量:程序级外部变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;文件:文件:main.cpp#includevoid fun2( ) int i=15; /自动类变量:函数级自动类变量:函数级 coutfun2():i(auto)=iendl; if(i) extern int i; /声明外部变量:程序级声明外部变量:程序级 c

35、outfun2():i(extern)=iendl; extern int i; /声明外部变量:程序级声明外部变量:程序级 void fun3( ) i=30; coutfun3():i(extern)=iendl; if(i) int i=10; /自动类变量:块级自动类变量:块级 coutfun3():i(auto)=iendl; 6) fun3():i(extern)=307) fun3():i(auto)=10文件:文件:file2.cpp例例4.21#include void fun1( ),fun2( ),fun3( );int i(5); /外部变量:程序级外部变量:程序级vo

36、id main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;8main():i=30文件:文件:main.cpp例例4.21#include void fun1( ),fun2( ),fun3( );int i(5); /外部变量:程序级外部变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=i

37、endl;8main():i=30文件:文件:main.cpp1. 内部函数内部函数 内部函数只在定义它的文件中可用!内部函数只在定义它的文件中可用! static () 2. 外部函数外部函数extern () 外部函数的作用域是整个程序!外部函数的作用域是整个程序!一、一、C+系统函数概述系统函数概述了解所用的了解所用的C+系统提供哪些系统函数;系统提供哪些系统函数;知道某系统函数的阐明放在哪个头文件中;知道某系统函数的阐明放在哪个头文件中;调用一个函数时,要清楚其功能、参数和调用一个函数时,要清楚其功能、参数和前往值。前往值。二、字符串处置函数二、字符串处置函数q 调用字符串处置函数时,

38、要包含头文件调用字符串处置函数时,要包含头文件string.hstring.h1. 字符串长度函数字符串长度函数strlen( ) int strlen(const char *s);前往字符一个字符串的长度,空字符不计在内前往字符一个字符串的长度,空字符不计在内2. 字符串拷贝函数字符串拷贝函数strcpy( ) char * strcpy(char *s1, char *s2); char * strncpy(char *s1, char *s2, int n);实现字符串的复制,前往实现字符串的复制,前往s1s1的地址的地址3. 字符串衔接函数字符串衔接函数strcat( ) char

39、* strcat(char *s1, char *s2); char * strncat(char *s1, char *s2, int n);4. 字符串比较函数字符串比较函数strcmp( ) int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, int n);前往值整数:大于前往值整数:大于0、等于、等于0、小于、小于0 函数的定义和阐明函数的定义和阐明 函数的调用传值、传址、援用函数的调用传值、传址、援用 嵌套调用和递归调用嵌套调用和递归调用 函数的参数默许值函数的

40、参数默许值 内联函数内联函数inlineinline 函数重载参数个数、类型不同函数重载参数个数、类型不同 作用域作用域4 4级级 C+C+系统函数字符串处置函数系统函数字符串处置函数实实 验验 一一调试调试例例4.8、例例4.13,掌握参数默许值的设置,掌握参数默许值的设置和函数重载;和函数重载;编制程序,经过调用援用作参数的函数,实现编制程序,经过调用援用作参数的函数,实现两个字符串的交换。两个字符串的交换。测试:测试:char a50=“hello; char b50=“how are you;编写程序验证哥德巴赫猜测:任何一个充分大编写程序验证哥德巴赫猜测:任何一个充分大的偶数的偶数(=6)总可以表示成两个素数之和。总可以表示成两个素数之和。#includevoid f(int j);void main( ) for(int i(1); i=4; i+) f( i );void f(int j) static int a(10); /内部静态类变量内部静态类变量 int b(1); /自动类变量自动类变量 b+; couta+b+j=a+b+jendl; a+=10;三三(3)10 + 2 + 1 = 1320 + 2 + 2 =

温馨提示

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

评论

0/150

提交评论