基本数据类型和运算符.ppt

上传人:tian****1990 文档编号:12828011 上传时间:2020-05-29 格式:PPT 页数:68 大小:288KB
返回 下载 相关 举报
基本数据类型和运算符.ppt_第1页
第1页 / 共68页
基本数据类型和运算符.ppt_第2页
第2页 / 共68页
基本数据类型和运算符.ppt_第3页
第3页 / 共68页
点击查看更多>>
资源描述
第二章基本数据类型和运算符,程序设计基础教程(C语言),程序设计基础教程(C语言),2,2020/5/27,本章重点,掌握C的几种基本数据类型。掌握标识符的概念,熟悉变量和符号常量先定义后使用特点。熟练掌握整型、长整型、短整型、无符号整型数据的定义与存储特点。熟练掌握单精度、双精度浮点数的定义与存储特点。熟练掌握字符型数据的的定义与存储特点,并熟悉整型数据与字符型数据间的关系。掌握定义变量的同时,赋初值的方法。掌握不同类型数据间的混合运算规则。掌握不同运算符(算术、关系、逻辑运算符等)的使用特点、清楚每种运算符的优先级与结合性.掌握各种表达式的含义与使用要点。,程序设计基础教程(C语言),3,2020/5/27,数据类型-数据的内在表现形式,即数据在加工计算过程中所表现出来的特征称为数据的类型,它常简称为“类型”。数据类型分为基本数据类型和导出类型(构造类型/复杂的数据类型)。,基本数据类型,程序设计基础教程(C语言),4,2020/5/27,C基本数据类型,程序设计基础教程(C语言),5,2020/5/27,数据在内存中存放,存放的格式由数据类型决定。各种数据类型所包含的二进制位数(bit,比特数)是不同的。数据类型的长度通常都是采用所占用的内存空间字节数来表示。,程序设计基础教程(C语言),6,2020/5/27,关键字、标识符和保留标识符,一、字符集C语言中可用到的字符集有:数字:、。字母:大、小写英文字母,注意C程序中严格区分大小写字母,如A和a是不同的字符。空白符:空格符、制表符、换行符和换页符统称为空白符。它们主要用于分隔单词,一般无其它特殊意义。,程序设计基础教程(C语言),7,2020/5/27,图形符号:29个图形(可见)符号,即!“#%:?|主要用作各种运算符。转义字符:程序中有时需要用到某些不可见或难以打印的字符,C语言中采用转义字符来表示,如:“n”表示一个换行符;字符被称为转移符,表示其后的字符n具有特定的含义。,程序设计基础教程(C语言),8,2020/5/27,二、词法约定C语言中单词形式:注释符、运算符、标点符、关键字和标识符。(1)注释符以“/*”开头、“*/”结束;或者用“/”注释当前行(2)运算符C语言中含有相当丰富的运算符。运算符与变量、函数一起组成表达式,表示各种运算功能。运算符由一个或多个字符组成。(3)标点符C语言中的标点符共有13个,即:()*,:=;.#,程序设计基础教程(C语言),9,2020/5/27,(4)标识符用于标识变量名、符号常量名、数组名、函数名、类型名、文件名的有效字符序列。标识符的组成:由字母、数字和下划线组成。必须由字母或下划线中任一字符开头。长度为任意的。例如,以下为合法的标识符:nameNAME_a1x1Sum_2以下不是合法的标识符:12a以数字开头#we以#开头num$1包含$字符sum1中间有空格,程序设计基础教程(C语言),10,2020/5/27,(5)保留标识符,保留标识符是系统保留的一部分标识符,通常用于系统定义和标准库函数的名字。例如,以下划线开始的标识符通常用于定义系统变量。不应该把这些标识符来定义自己的变量。虽然它们也是合法的标识符,但是用它们来做一般标识符就可能会出问题。,程序设计基础教程(C语言),11,2020/5/27,试判断下列标识符正确与否:,abcdA?Abcd2abc_Abcdab_2a3yes/nor,程序设计基础教程(C语言),12,2020/5/27,(6)关键字:又称保留字,指具有特定含义、专门用作系统的特定成分的一类标识符。标准语言中共有个关键字,按用途分为类:数据类型:如charint等存储类:如auto等流程控制:如ifswitch等运算符:sizeof注意:关键字不能用作一般标识符,即不允许用作变量名或函数名等。C语言的关键字都是小写的。例如else是关键字,但ELSE就不是关键字。,程序设计基础教程(C语言),13,2020/5/27,2.1基本数据类型2.1.2常量,1、常量的定义:在程序运行过程中,其值保持不变的量常量的类型:根据字面形式可将常量区分为不同的类型。2、整型常量:C语言表示整型常量的方法有以下三种:十进制整数:不带任何修饰。如123、-456、0等;八进制整数:以数字0开头。如0123、-011等;十六进制整数:以数字0 x开头。如0 x123、0 x2ef;,程序设计基础教程(C语言),14,2020/5/27,整型常量,C语言中普通整型常量在机器中占用一个字长。整型常量后缀无符号整型后缀:u或U,如986u、0 xfedU都是无符号整型常量。长整型后缀:l或L,如:02341l、9666L都是长整型常量。二者可以同时使用,例如:9999LU、077777LU,程序设计基础教程(C语言),15,2020/5/27,实型常量,3、实型常量(浮点数)十进制数形式的浮点数:由数字和小数点组成。如:123.456、0.123、123.0、0.0、123.等。指数形式的浮点数:用字母e表示十进制指数中的10。如:123e3(表示123*103)、6.E5、.123e+4都是合法的浮点常量。注意:e字母前必须有数字,且e后的指数必须为整型。如:e3、2.1e3.5、.e3为不合法。,程序设计基础教程(C语言),16,2020/5/27,实型常量,浮点常量如不带后缀,如上所示,都是双精度类型(double)。浮点常量可带后缀f或F,如3.14f,那么其类型为单精度浮点型(float)浮点常量可带后缀l或L,如3.14L,那么其类型为长双精度型(longdouble),程序设计基础教程(C语言),17,2020/5/27,4、字符常量:C语言规定以单引号包围的单个字符为字符常量。如:A、a、2、!等。注意:请区别A和a的不同;中的字符引用的是该字符的ASCII码值。字符常量的存放形式与整数的存放形式相类似,故C中的字符数据与整型数据之间具有相通性。,程序设计基础教程(C语言),18,2020/5/27,字符常量,转义字符常量(也称控制字符常量)用开头的特殊形式的字符常量,用以产生一个动作。如:n、r、t、v、123等。请同学们理解并记忆常用的转义字符,学会其使用方法。,程序设计基础教程(C语言),19,2020/5/27,转义字符常量,转义字符功能n换行t横向跳格v竖向跳格b退格r回车f走纸换页“”字符单引号字符”双引号字符a响铃ddd1至3位八进制数所代表的字符xhh1至2位十六进制数所代表的字符,注:横向和纵向跳格均以8个字符为1格。,程序设计基础教程(C语言),20,2020/5/27,5、字符串常量C语言中用双引号将一串字符括起来称为字符串常量。如“asee”、“011”、“WearestudyingC”等。字符串常量可以看作是一个数组,这个数组的每个元素是一个字符。编译程序在编译源程序时自动在每个字符串末尾放空字符0,作为字符串结束标记。,程序设计基础教程(C语言),21,2020/5/27,要点:请区别”A”与A的不同。因为它们各自在内存中存放的长度不同。“A”A,ASCII码为0的字符,程序设计基础教程(C语言),22,2020/5/27,6、符号常量1)含义:用一个标识符表示的常量。2)定义方法:#define符号常量数值例:#definePRICE30在程序任何用到PRICE符号常量的地方,系统将自动用常量30代替。3)使用要点:为区分符号常量与变量的不同,通常符号常量用大写字母表示(但不是必须)。,程序设计基础教程(C语言),23,2020/5/27,2.1.3变量,1、变量的含义:在程序执行过程中,其值可以被改变的量。变量的构成:变量名、变量值。(注意区分变量名和变量值:存储单元地址与存储单元内容),程序设计基础教程(C语言),24,2020/5/27,变量名=初值例:inta,b,c;/*说明a,b,c为整型变量*/charcc;/*说明cc为字符变量*/doublex,y;/*说明x,y为双精度实型变量*/变量名的启用不要与系统的关键字相同,也不要与C语言标准函数库中的函数名相同。,2.1.3变量,程序设计基础教程(C语言),25,2020/5/27,C语言要求,程序里使用的每个变量都必须“先定义,后使用”不同类型的变量应分开定义。在同一程序的同一部分,不允许对同一变量做重复定义,也就是说,不允许有同名的变量。,程序设计基础教程(C语言),26,2020/5/27,2、变量的初始化:在定义变量同时可以对变量赋予初值。例如:inti1=3,i2=4;floatf1,f2=3.5;,还可以在定义后赋初值。例如:inti1,i2;/*定义整型变量i1和i2*/i1=3;i2=4;/*为i1赋初值为3,i2赋初值为4*/,程序设计基础教程(C语言),27,2020/5/27,3、左值和右值:左值(lvalue):在C语言中表示位于赋值运算符左边的值,左值通常指可以定位的值,即有地址的值,可以用来存储其它的值。右值(rvalue):在C语言中表示位于赋值运算符右边的值。例:inti=5;,程序设计基础教程(C语言),28,2020/5/27,3、左值和右值:x=5;5=x;C中有些运算符仅仅需要操作数需要右值,例如“+”的两侧、赋值运算符的右边;有些运算符仅仅需要左值,例如赋值运算符“=”的左边;有些运算符需要操作数同时有右值与左值的角色,例如+或-。,程序设计基础教程(C语言),29,2020/5/27,4、数据输入和输出printf()的功能:按照指定格式将需要输出的数据在标准输出设备上输出。它的一般格式:printf(输出控制,输出数据表列);(1)输出控制表示由双引号括起来的格式转换控制信息。它分为两种形式的信息。一种是用于说明的,计算机会原样输出的信息。另一种是带有前置百分号(%)的格式转换说明,用户用它指定输出数据的格式。(2)输出数据表列表示需要输出的一些数据。各数据之间用逗号分隔。,程序设计基础教程(C语言),30,2020/5/27,照原样输出的部分,如:printf(“VisualC+6.0”);在显示器上输出“VisualC+6.0”要原样输出双引号”、单引号和反斜杠都必须在其前面加上一个反斜杠,要原样输出%则必须用两个%。,程序设计基础教程(C语言),31,2020/5/27,(2)转换控制部分,以%开头用转换字符(英文小写字母)结束的部分,称之为“转换说明符”。其格式为:“%W.N修饰符l或L转换字符”例:printf(“%d”,100);转换字符:又称“转换说明符”,常用的转换说明符及其含义如表2.10所示。,程序设计基础教程(C语言),32,2020/5/27,例如:输出整型变量i和j,使用printf()函数。为增强可读性,可插入说明信息“i=”和“j=”。写成:printf(“i=%d,j=%d,i,j);其中,第一个“%d”与i对应,第二个“%d”与j对应。设i、j的值分别为1和2,则输出结果为:i=1,j=2使用printf()函数时,必须使用文件包含预编译指令:#include,程序设计基础教程(C语言),33,2020/5/27,例:字符输出#includevoidmain(void)charc=a;intk=97;printf(%c,%dn,c,c);printf(%c,%dn,k,k);,输出为:a,97a,97,程序设计基础教程(C语言),34,2020/5/27,2.2运算符和表达式,表达式的概念表达式是由运算对象和运算符组成的式子。表达式的求值规则是通过表达式中的运算符来实现的。一个常量,一个变量,都可以看成是一个表达式。分类:单目运算符:+、-双目运算符:+、-、*、/三目运算符:?:,程序设计基础教程(C语言),35,2020/5/27,2.2.1算术运算符,用算术运算符或圆括号将运算对象(运算分量)连接起来的式子称为算术表达式。在算术表达式中,有下面五个算术运算符:+、-、*、/、%注意:如a/b,如果a和b都是整型量,则其商也为整型量,小数部分被舍去。如5/2结果为2,如果a、b中有一个或都是实型量,则a和b都化为实型量,然后相除,结果为实型类型的量。如5.0/2,结果为2.5“%”是求余运算符。如a%b,其结果为a除以b后的余数。运算符“%”要求它的两个运算对象都必须是整型量,其结果也是整型量。如5%2的结果为1。余数的符号:跟第一个操作数相关。,程序设计基础教程(C语言),36,2020/5/27,思考:在数学中,564的运算结果与645的结果相同吗?C语言中,表达式5*6/4与6/4*5的结果相同吗?表达式8/(8/10)合法吗?,程序设计基础教程(C语言),37,2020/5/27,标准系统库函数调用,为了方便用户的程序编写,C语言编制者将一些常用功能编制成函数,并把它们集中放入系统的函数库中,作为标准系统库函数提供给用户使用。使用时只需要按照规定的格式书写出来就可以了。,程序设计基础教程(C语言),38,2020/5/27,标准系统库函数调用,调用函数的格式为:函数名(参数,参数,);如:调用pow()函数应包含文件,因此,在调用pow()函数以前,使用如下预编译命令:#includepow()函数原型:doublepow(doublex,doubley),程序设计基础教程(C语言),39,2020/5/27,标准系统库函数调用,例:#include#includevoidmain()doublex,y;x=8.0;y=3.0;printf(z=%lfn,x*(3.0+pow(x,y);,程序设计基础教程(C语言),40,2020/5/27,【例2-9】将下列数学表达式改写为符合C语言规则的算术表达式。改写成C语言表达式为:3.14159*r*r/2.0改写成C语言表达式为:(m*n+pow(m,n)/(sin(x)+cos(y),程序设计基础教程(C语言),41,2020/5/27,2.2.2赋值运算符,1、赋值运算符和赋值表达式赋值表达式的一般格式为:变量=表达式说明:赋值运算符左边必须是左值,通常是变量。赋值运算符是对右边表达式求值以后再将该值送给左边的变量。赋值运算符与数学上的等号是一样的,但含义不一样。如果赋值号两边的类型不一致,则赋值时会自动进行类型转换。转换原则:右边左边(5)赋值运算可以连续进行。例如,a=b=c=10,程序设计基础教程(C语言),42,2020/5/27,2.2.2赋值运算符,2.复合赋值运算符C语言中提供了另一类赋值运算符,称为复合赋值运算符。例如+=、-=、*=、/=、%=。上面5个复合运算符的等价形式:a+=b+c等价于a=a+(b+c)a-=b+c等价于a=a-(b+c)a*=b+c等价于a=a*(b+c)a/=b+c等价于a=a/(b+c)a%=b+c等价于a=a%(b+c)注意:复合运算符在书写时,两个运算符之间不能有空格,否则就是错误的。,程序设计基础教程(C语言),43,2020/5/27,2.2.2赋值运算符,3、赋值语句在赋值表达式的末尾加上一个分号,就构成了一个赋值语句。例如:i=j+k+1;(一般算术赋值语句)a=b=c=10;(连续赋值语句)a+=1;(复合赋值语句)注意:赋值语句和赋值表达式在程序中所处的地位不一样。赋值语句可以作为一个独立的语句出现在C程序中,而赋值表达式却不能作为一个语句出现,只能作为语句中的一个成分出现在语句中。,程序设计基础教程(C语言),44,2020/5/27,【例】写出下面程序的输出结果。#includevoidmain()inta=1,b,c;b=a+1;printf(1)b=%dn,b);a=b+1;printf(2)a=%dn,a);c=(a+b)/2;printf(3)c=%dn,c);b=c+b;printf(4)b=%dn,b);c+=a+b;printf(5)c=%dn,c);,输出结果为:(1)b=2(2)a=3(3)c=2(4)b=4(5)c=9,程序设计基础教程(C语言),45,2020/5/27,使用举例:a=b=c=3a=5+(c=2)a=(b=4)+(c=6)a=(b=10)/(c=2)a+=a-=a*a,表达式值为3,a,b,c值均为3表达式值为7,a值为7,c为2表达式值为10,a=10,b=4,c=6表达式值为5,a=5,b=10,c=2若a=12,(1)则a-=a*a后,a=-132,(2)a+=-132后,a=-264,程序设计基础教程(C语言),46,2020/5/27,【例】将大写字母K转换成小写字母k输出。,#includevoidmain()charc1,c2;c1=K;c2=c1+a-A;printf(%c,c2);,分析:在ASCII码表中,小写字母和大写字母都是分别按字母顺序紧密排列在编码表中,并且大、小写字母ASCII码值的差值都为32。每个字母的大、小写差值可以用表达式表示为a-A,,程序运行结果为:k,程序设计基础教程(C语言),47,2020/5/27,2.2.3增/减量运算符,C语言的表达式中,可以使用两个与众不同的单目运算符。这两个运算符是:+和-。它们既可以出现在运算对象的前面,称为前缀运算符;又可以出现在运算对象的后面,称为后缀运算符。“+”称为自增运算符,它的功能是使变量的值加1,“-”称为自减运算符,它的功能是使变量的值减1。注意:增量运算符所作用的运算对象必须有左值,不能是常量或由运算符构成的表达式。例如,+(x+y)、+5都是不正确的,程序设计基础教程(C语言),48,2020/5/27,2.2.3增/减量运算符,前缀运算符的运算法则是:在使用变量之前,先使变量加1或减1;后缀运算符的运算法则是:在使用变量之后,再使变量加1或减1。例如,设i的值为1,则执行赋值语句j=i+;后,j为1,而i变为2。它等价于执行下面两个语句j=i;i=i+1;但是,执行赋值语句j=+i;后,则j变为2,i变为2。它等价于执行下列两个语句i=i+1;j=i;,程序设计基础教程(C语言),49,2020/5/27,2.2.3增/减量运算符,【例2.16】指出下面程序执行后的结果。#includevoidmain()inti,j;i=3;printf(j=%dn,j=i+);printf(i=%dn,i);printf(j=%dn,j=+i);printf(i=%dn,i);,结果为:j=3i=4j=5i=5,程序设计基础教程(C语言),50,2020/5/27,例,#includevoidmain(void)inti=1;printf(%dn,i+i+);i=1;printf(%dn,+i+i);i=1;printf(%dn,i+i);i=1;printf(%dn,i+(+i);,运行结果:2424,注意:慎用或,特别是在同一个表达式中多次出现同一个变量时不要做增/减量运算。,程序设计基础教程(C语言),51,2020/5/27,副作用和顺序点,在求表达式的值的同时,产生运算量存储的操作称为副作用。赋值操作、复合赋值操作和增量操作都会产生副作用。例如,表达式c=a+;会产生副作用,求得c的值和a的增值。顺序点(sequencepoint)是程序执行中关键的一点。在这个顺序点之前,所有的副作用的计算工作都必须完成。寻找顺序点的方法:语句的分号是一个顺序点;完全表达式求值结束产生一个顺序点;某些运算符产生顺序点。,程序设计基础教程(C语言),52,2020/5/27,2.2.4关系运算符,C语言中提供了六种关系运算符,用来表示两个运算对象之间的大小或相等关系。它们是:(大于)=(大于等于),b,a=(a+c),a=bc=50都是合法的关系表达式。关系表达式的结果是“真”(1)和“假“(0),在C语言中,凡是非0的值都是“真值”,值才是假值。,程序设计基础教程(C语言),53,2020/5/27,2.2.5逻辑运算符,C语言中提供了三个逻辑运算符,它们是:!(逻辑非):是单目运算符,如!a。若a为非零,则!a为0;若a为零,则!a为1。否则,只要其中有一个运算对象为零,则结果就为0。(逻辑或):是双目运算符,如ab。仅当两个运算对象的值同时为0时,结果才为0;否则,结果为1。用逻辑运算符将表达式连接起来的式子称为逻辑表达式。,程序设计基础教程(C语言),54,2020/5/27,在逻辑表达式中,若连续出现多个d!=0(j=0),运行结果:3,0,31,2,3,程序设计基础教程(C语言),56,2020/5/27,2.2.6条件运算符,C语言中提供了一个与众不同的三目运算符“?:”。由这个运算符构成的表达式形式为:e?e1:e2其中,e、e1、e2代表表达式。条件表达式的求值法则是:首先求解e的值,若e值为非0,则取e1的值作为条件表达式的值;若e值为0,则取e2的值作为条件表达式的值。例如,求a、b中的最大值的条件表达式为:(ab)?ab注意:符号“?”处有一个顺序点,它保证表达式e中的所有副作用都必须在求e1或e2之前完成。例如:(ab+)?c=b:c=b+5在执行c=b或c=b+5以前,b一定增值。,程序设计基础教程(C语言),57,2020/5/27,例:#includevoidmain(void)floatx=1.0;inta=2,b=3;x=(ab)?a:b;printf(“%f”,x);,输出为:3.000000,条件表达式(ab)?a:b的值为整型数据,但x为实型数据,所以输出为实型数据.,程序设计基础教程(C语言),58,2020/5/27,#includevoidmain(void)inta=1,b=1,c=1;a+=b;b+=c;c+=a;printf(“(1)%dn”,ab?a:b);printf(“(2)%dn”,ac?a-:c+);(a=b=c)?printf(“AA”):printf(“CC”);printf(“na=%d,b=%d,c=%dn”,a,b,c);,运行结果:(1)2(2)3CCa=2,b=2,c=4,程序设计基础教程(C语言),59,2020/5/27,2.2.7逗号运算符和逗号表达式,C语言中,逗号还有另一个作用逗号运算符。用逗号运算符把两个或两个以上的表达式连接起来,就构成了逗号表达式。其格式为:(表达式1,表达式2,.,表达式n)由于逗号运算符的优先级最低,所以用圆括号括起来以表示是一个完整的逗号表达式,其求解过程是从左至右求每个表达式的值,最右边“表达式n”的值才是整个逗号表达式的结果值。例如:unsignedx,y=10;x=(y-=5,10/y);,程序设计基础教程(C语言),60,2020/5/27,其它运算符,长度运算符(sizeof)sizeof(数据类型名或变量名)它是单目运算符,运算的结果值是以字节为单位给出运算量的长度(即几个字节)。,程序设计基础教程(C语言),61,2020/5/27,2.2.8运算符优先级和结合方向,各种运算符按由高到低的优先关系描述如下:初等运算符单目运算符算术运算符关系运算符逻辑运算符(“!”除外)条件运算符赋值运算符逗号运算符,高低,程序设计基础教程(C语言),62,2020/5/27,运算符的结合规则中,只有3种是“从右至左”结合,它们是单目运算符、条件运算符和赋值运算符等,其它的全部都是“从左至右”结合。优先级最高的4个运算符中,圆括号不仅可作为函数的参数表,还可用来改变优先级。如:if(x,程序设计基础教程(C语言),63,2020/5/27,2.3数据类型的转换,在C中,数据类型可以转换为另一种类型。自动转换:在表达式1+3.14159+0+A出现不同类型的数据将会自动转换。转换原则是由低类型向高类型靠拢。注意:转换的过程不仅仅是自动的,而且是逐步转换的。强制转换:使用强制类型转换符(类型名)表达式例如:设变量c、d的类型分别为char和double,则c+(char)d的结果类型为int。,程序设计基础教程(C语言),64,2020/5/27,返回,c+f+i+dcharfloatintdouble,floatfloatdouble,【例】考虑如下类型的变量:charc;inti;floatf;doubled;试分析如下表达式运算过程中类型转换的状态:c+f+i+d,自动转换,程序设计基础教程(C语言),65,2020/5/27,强制转换,【例】执行如下程序:#includevoidmain()inti,j;i=1;j=2;printf(”i=%d,j=%f”,i,(float)j);输出结果为:,i=1,j=2.000000,程序设计基础教程(C语言),66,2020/5/27,应用:(1)为满足运算的要求:如:inti=3;floatx=13.6;(int)x%i;(13%3=1)(2)提高运算精度:如:inti=10;floatx;x=i/3+25.5;(3+25.5=28.5)或x=(float)i/3+25.5;(3.33+25.5=28.83),程序设计基础教程(C语言),67,2020/5/27,#includevoidmain()floatx;inti;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);注意:x本身的值和类型都没有改变,强制类型转换只改变数值类型和值,不改变变量的值和类型。,程序的运行结果为:x=3.600000,i=3,程序设计基础教程(C语言),68,2020/5/27,THEEND,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!