《c数据类型与流程控制gby.pptx》由会员分享,可在线阅读,更多相关《c数据类型与流程控制gby.pptx(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第2章 数据类型与流程控制数据类型与流程控制2.1 数据类型 2.1.1 C#2.1.1 C#数据类型的分类数据类型的分类为了方便识别和处理,编程语言系统中的不同信息在计算为了方便识别和处理,编程语言系统中的不同信息在计算机中具有不同的表示,占用不同的储存空间,这些信息在机中具有不同的表示,占用不同的储存空间,这些信息在语言系统中称之为数据类型。语言系统中称之为数据类型。C#C#中的数据类型和中的数据类型和C+C+是类似的。但在是类似的。但在C#C#中数据类型分中数据类型分为两种:值类型和引用类型,如图为两种:值类型和引用类型,如图2-12-1所示。值类型包括所示。值类型包括一些数值类型(例如
2、一些数值类型(例如intint和和floatfloat)、)、charchar、枚举类型和结构、枚举类型和结构类型。引用类型包括类、接口、委托类型。引用类型包括类、接口、委托(delegate)(delegate)和数组类和数组类型。在型。在C#C#中,内置数据类型除了字符串(中,内置数据类型除了字符串(stringstring)类型与)类型与对象(对象(objectobject)类型外,其余均为值类型。)类型外,其余均为值类型。2.1 数据类型C#中的数据类型的划分如图2-1所示。2.1 数据类型值类型和引用类型的区别在于:值类型变量直接存储在值类型和引用类型的区别在于:值类型变量直接存储在
3、堆栈中,且占用空间大小相对固定,变量直接包含他们堆栈中,且占用空间大小相对固定,变量直接包含他们的数据,可以直接访问其值,访问速度快;而引用类型的数据,可以直接访问其值,访问速度快;而引用类型数据需要通过存储在栈中的引用来间接访问其值,实际数据需要通过存储在栈中的引用来间接访问其值,实际内容存储在内存的堆中,占用空间大小不固定,访问速内容存储在内存的堆中,占用空间大小不固定,访问速度慢。度慢。表表2-12-1所示为值类型和引用类型的区别。所示为值类型和引用类型的区别。特性特性值类型值类型引用类型引用类型变量中保存的内容变量中保存的内容实际数据实际数据指向实际数据的引用指针指向实际数据的引用指针
4、内存空间配置内存空间配置堆栈堆栈受管制的堆受管制的堆内存需求内存需求较少较少较多较多执行效率执行效率较快较快较慢较慢内存释放时间点内存释放时间点执行超过定义变量的作用域时执行超过定义变量的作用域时由垃圾回收机制负责回收由垃圾回收机制负责回收2.1 数据类型1整数类型整数类型(也叫整型)表示无小数部分的数字。根据变量整数类型(也叫整型)表示无小数部分的数字。根据变量在内存中所占的位数不同,在内存中所占的位数不同,C#C#将整型分为将整型分为8 8种:字节型种:字节型(sbytesbyte)、无符号字节型()、无符号字节型(bytebyte)、短整型()、短整型(shortshort)、)、无符号
5、短整型(无符号短整型(ushortushort)、整型()、整型(intint)、无符号整型)、无符号整型(uintuint)、长整型()、长整型(longlong)、无符号长整型()、无符号长整型(ulongulong)。整)。整型的说明及示例如表型的说明及示例如表2-22-2所示。所示。2.1 数据类型表表2-2 2-2 整数类型的关键字及说明整数类型的关键字及说明关键字关键字.NET.NET类型类型说说 明明示示 例例sbytesbyteSystem.SbyteSystem.Sbyte8 8位有符号整型,取值位有符号整型,取值128127128127sbyte val=12;sbyte
6、val=12;bytebyteSystem.ByteSystem.Byte8 8位无符号整型,取值位无符号整型,取值02550255short val=12;short val=12;intintSystem.Int32System.Int323232位有符号整型,取值位有符号整型,取值-2-23131223131-1-1int val=12;int val=12;uintuintSystem.UInt32System.UInt323232位无符号整型,取值位无符号整型,取值02023232-1-1uint val1=12;uint val1=12;uint val2=32U;uint val
7、2=32U;shortshortSystem.Int16System.Int161616位有符号整型,取值位有符号整型,取值-2-21515221515-1-1short val1=12;short val1=12;ushortushortSystem.UInt16System.UInt161616位无符号整型,取值位无符号整型,取值02021616-1-1ushort val1=12;ushort val1=12;longlongSystem.Int64System.Int646464位有符号整型,取值位有符号整型,取值-2-26363226363-1-1long val1=12;long
8、val1=12;long val2=12L;long val2=12L;ulongulongSystem.UInt64System.UInt646464位无符号整型,取值位无符号整型,取值02026464-1-1ulong val1=23;ulong val1=23;ulong val2=23U;ulong val2=23U;ulong val3=56L;ulong val3=56L;2.1 数据类型2 2实数类型实数类型C#C#中的实数类型有中的实数类型有中的实数类型有中的实数类型有3 3种:种:种:种:floatfloat、doubledouble、decimaldecimal。其中。其中
9、。其中。其中doubledouble的取值范围最广,的取值范围最广,的取值范围最广,的取值范围最广,decimaldecimal取值范围其次,但它的取值范围其次,但它的取值范围其次,但它的取值范围其次,但它的精度高。具体见表精度高。具体见表精度高。具体见表精度高。具体见表2-32-3。表表2-3 2-3 实数类型的关键字及说明实数类型的关键字及说明关键字关键字.NET.NET类型类型说说 明明示示 例例floatfloatSystem.FlSystem.Floatoat3232位单精度浮点型,位单精度浮点型,1.5101.510-45-45 3.4103.4103838,精度为,精度为7 7位
10、位float val=12.3F;float val=12.3F;doubledoubleSystem.DoSystem.Doubleuble6464位双精度浮点型,位双精度浮点型,5.0105.010-324-324 1.7101.710308308,精度为,精度为15151616位位double val=23.12D;double val=23.12D;decimaldecimalSystem.DeSystem.Decimalcimal128128位小数类型,位小数类型,1.0101.010-28-28到到7.9107.9102828精度为精度为28282929位位decimal val=
11、1.23M;decimal val=1.23M;2.1 数据类型3 3字符类型和字符串类型字符类型和字符串类型字符类型也叫字符型,用字符类型也叫字符型,用charchar表示,为单个表示,为单个UnicodeUnicode字字符,一个符,一个UnicodeUnicode字符的标准长度为两个字节,它在机字符的标准长度为两个字节,它在机器中占器中占1616位,其范围为位,其范围为0 06553565535。字符一般是用单引号。字符一般是用单引号括起来的一个字符,如:括起来的一个字符,如:aa,AA,也可以写成转义字,也可以写成转义字符、十六进制转换码或符、十六进制转换码或UnicodeUnicod
12、e表示形式。此外,整数表示形式。此外,整数也可以显式地转换为字符。也可以显式地转换为字符。2.1 数据类型常用的转义字符如表常用的转义字符如表2-42-4所示。所示。转义符转义符字字 符符 名名字符的字符的UnicodeUnicode值值转义符转义符字字 符符 名名字符的字符的UnicodeUnicode值值单引号单引号0 x00270 x0027ff换页换页0 x000c0 x000c双引号双引号0 x00220 x0022nn新行新行0 x000A0 x000A反斜杠反斜杠0 x005c0 x005crr回车回车0 x000D0 x000D00空字符空字符0 x00000 x0000tt水
13、平制表符水平制表符0 x00090 x0009aa警告(产生蜂鸣)警告(产生蜂鸣)0 x00070 x0007vv垂直制表符垂直制表符0 x000B0 x000Bbb退格退格0 x00080 x00082.1 数据类型4 4布尔类型布尔类型布尔型主要用于逻辑判断,这种类型的数据只有布尔型主要用于逻辑判断,这种类型的数据只有truetrue和和falsefalse两个值。在两个值。在C+C+中,中,falsefalse相当于相当于0 0,truetrue相当于相当于1 1。但在。但在C#C#中,废弃了这种不正规的表中,废弃了这种不正规的表达方式,达方式,truetrue值不能被任何非零值取代,将
14、整数值不能被任何非零值取代,将整数类型转换为布尔类型是不合法的。例如:类型转换为布尔类型是不合法的。例如:bool x=1;/bool x=1;/错误,不存在这种写法错误,不存在这种写法bool y=1;/bool y=1;/错误,不存在这种写法错误,不存在这种写法bool x=true;/bool x=true;/正确,可以被执行正确,可以被执行2.1 数据类型5 5枚举类型枚举类型枚举类型是值类型的一种特殊形式,它从枚举类型是值类型的一种特殊形式,它从枚举类型是值类型的一种特殊形式,它从枚举类型是值类型的一种特殊形式,它从System.EnumSystem.Enum继承而来,并为基础类型的
15、值(如继承而来,并为基础类型的值(如继承而来,并为基础类型的值(如继承而来,并为基础类型的值(如ByteByte、Int32Int32或或或或UInt64UInt64)提供替代名称。枚举类型)提供替代名称。枚举类型)提供替代名称。枚举类型)提供替代名称。枚举类型也是一种自定义数据类型,它允许用符号代表数也是一种自定义数据类型,它允许用符号代表数也是一种自定义数据类型,它允许用符号代表数也是一种自定义数据类型,它允许用符号代表数据。枚举是指程序中某个变量具有一组确定的值,据。枚举是指程序中某个变量具有一组确定的值,据。枚举是指程序中某个变量具有一组确定的值,据。枚举是指程序中某个变量具有一组确定
16、的值,通过通过通过通过“枚举枚举枚举枚举”可以将其值一一列出来。可以将其值一一列出来。可以将其值一一列出来。可以将其值一一列出来。enumenum关键字用于声明枚举类型,基本格式如下:关键字用于声明枚举类型,基本格式如下:关键字用于声明枚举类型,基本格式如下:关键字用于声明枚举类型,基本格式如下:enum enum 枚举类型名枚举类型名枚举类型名枚举类型名 由逗号分隔的枚举数标识符由逗号分隔的枚举数标识符由逗号分隔的枚举数标识符由逗号分隔的枚举数标识符 ;2.1 数据类型【例【例2-12-1】枚举类型示例。】枚举类型示例。using System;using System;using Syst
17、em.Collections.Generic;using System.Collections.Generic;using System.Linq;using System.Linq;using System.Text;using System.Text;namespace ex01namespace ex01 class Program class Program enum week monday,tuesday,wednesday,thursday,friday,saturday,sunday;enum week monday,tuesday,wednesday,thursday,frid
18、ay,saturday,sunday;static void Main(string args)static void Main(string args)week day=week.thursday;week day=week.thursday;int a=(int)day;int a=(int)day;int b=(int)week.sunday;int b=(int)week.sunday;Console.WriteLine(a=0,b=1,a,b);Console.WriteLine(a=0,b=1,a,b);Console.ReadLine();Console.ReadLine();2
19、.1 数据类型6结构类型结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数、常数、字段、方法、属性、索引器等。结构与类不同在于结构为值类型而不是引用类型,并且结构不支持继承。结构类型将在第4章讲解。2.2 不同数据类型之间的转换 2.2.1 2.2.1 显式转换与隐式转换显式转换与隐式转换 1.1.隐式转换隐式转换C#C#是一个强类型的语言,它的数值类型有一些可是一个强类型的语言,它的数值类型有一些可以进行隐式转换,其他的必须显式转换,隐式转以进行隐式转换,其他的必须显式转换,隐式转换的类型只能是长度短的类型转换成长的类型换的类型只能是长度短的类型转换成长的类型(见表(
20、见表2-52-5所示),例如所示),例如intint可以转换成可以转换成longlong,floatfloat,doubledouble,decimaldecimal;反之必须显式的转换。例如:;反之必须显式的转换。例如:int a=7;int a=7;float b=a;/float b=a;/隐式转换隐式转换 a=(int)c;/a=(int)c;/显示转换显示转换 2.2 不同数据类型之间的转换表2-5 C#中支持的隐式转换源类型源类型目标类型目标类型sbytesbyteshortshort、intint、longlong、floatfloat、doubledouble、decimald
21、ecimalbytebyteshortshort、ushortushort、intint、uintuint、longlong、ulongulong、floatfloat、doubledouble、decimaldecimalshortshortintint、longlong、floatfloat、doubledouble、decimaldecimalushortushortintint、uintuint、longlong、ulongulong、floatfloat、doubledouble、decimaldecimalintintlonglong、floatfloat、doubledouble
22、、decimaldecimaluintuintlonglong、ulongulong、floatfloat、doubledouble、decimaldecimallonglongfloatfloat、doubledouble、decimaldecimalulongulongfloatfloat、doubledouble、decimaldecimalcharcharushortushort、intint、uintuint、longlong、ulongulong、floatfloat、doubledouble、decimaldecimalfloatfloatdoubledouble2.2 不同数据
23、类型之间的转换2.显式转换显式转换又叫强制类型转换,与隐式转换相反,显式转换需要用户明确地指定转换类型,一般在不存在该类型的隐式转换时才使用。格式如下:(类型标识符)表达式其作用是将“表达式”值的类型转换为“类型标识符”的类型。例如:(int)1.23 /把double类型的1.23转换成int类型,结果为12.2 不同数据类型之间的转换使用上面的显示转换不能用在使用上面的显示转换不能用在boolbool和和stringstring类型上,如果类型上,如果希望希望stringstring或者或者boolbool类型和整数类型之间的转化可以使用类型和整数类型之间的转化可以使用一个方法一个方法Co
24、nvertConvert。格式如下:。格式如下:Convert.Convert.方法名方法名(参数参数)方法名是方法名是ToTo数据类型形式,具体含义见表数据类型形式,具体含义见表2-62-6。2.2 不同数据类型之间的转换 表表2-6 Convert.2-6 Convert.方法含义方法含义方法名方法名含义含义ToBooleanToBoolean将数据将数据转换转换成成BooleanBoolean类类型型ToDataTimeToDataTime将数据将数据转换转换成日期成日期时间类时间类型型ToInt16ToInt16将数据将数据转换转换成成1616位整数位整数类类型型ToInt32ToIn
25、t32将数据将数据转换转换成成3232位整数位整数类类型型ToInt64ToInt64将数据将数据转换转换成成6464位整数位整数类类型型ToNumberToNumber将数据将数据转换转换成成DoubleDouble类类型型ToObjectToObject将数据将数据转换转换成成ObjectObject类类型型ToStringToString将数据将数据转换转换成成stringstring类类型型ToBooleanToBoolean将数据将数据转换转换成成BooleanBoolean类类型型2.2 不同数据类型之间的转换2.2.2 2.2.2 装箱和拆箱装箱和拆箱对于值类型和对于值类型和Ob
26、jectObject类型之间的转换,可以用装箱技术和类型之间的转换,可以用装箱技术和拆箱技术来实现。拆箱技术来实现。C#C#中的任何类型的值都可以按照对象中的任何类型的值都可以按照对象来处理,使用来处理,使用objectobject类型的通用库(如类型的通用库(如.NET Framework.NET Framework中中的集合类)既可以用于引用类型,又可以用于值类型。的集合类)既可以用于引用类型,又可以用于值类型。(1 1)ObjectObject类类ObjectObject类是所有类的基类,它是类是所有类的基类,它是SystemSystem命名空间下的一个命名空间下的一个类,类,C#C#中
27、所有的类型都是直接或间接地从中所有的类型都是直接或间接地从ObjectObject类继承而类继承而来。因为它是所有对象的基类,所以可把任何类型的值赋来。因为它是所有对象的基类,所以可把任何类型的值赋给它,例如,一个整型:给它,例如,一个整型:object theObj=123;object theObj=123;2.2 不同数据类型之间的转换1.装箱转换装箱转换是指将一个值类型的数据隐式地转换成一个对象类型的数据。把一个值类型装箱,就是创建一个obj ect类型的实例,并把该值类型的值复制给这个obj ect实例。例如,下面语句就执行了装箱转换:int i=123;object obj=i;/
28、装箱转换2.2 不同数据类型之间的转换上面的两条语句中,第上面的两条语句中,第1 1条语句先声明一个整型变量条语句先声明一个整型变量i i并对并对其赋值,第其赋值,第2 2条语句则先创建一个条语句则先创建一个obj ectobj ect类型的实例类型的实例objobj,然后将然后将i i的值复制给的值复制给objobj。装箱操作过程如图。装箱操作过程如图2-22-2所示。所示。在执行装箱转换时,也可以使用显式转换,如:在执行装箱转换时,也可以使用显式转换,如:object obj=(object)i;object obj=(object)i;2.2 不同数据类型之间的转换2.2.拆箱转换拆箱转
29、换拆箱转换是指将一个对象类型的数据显式地转换拆箱转换是指将一个对象类型的数据显式地转换成一个值类型数据。例如,下面语句就执行了拆成一个值类型数据。例如,下面语句就执行了拆箱转换:箱转换:int i=123;int i=123;object obj=i;object obj=i;int j=(int)obj;/int j=(int)obj;/拆箱转换拆箱转换拆箱操作的过程如图拆箱操作的过程如图2-32-3所示。拆箱转换需要(而所示。拆箱转换需要(而且必须)执行显式转换,这是它与装箱转换的不且必须)执行显式转换,这是它与装箱转换的不同之处。同之处。2.3 常量和变量2.3.1 2.3.1 常量常量
30、常量就是值在程序整个生命周期内值始终不变的量。在声常量就是值在程序整个生命周期内值始终不变的量。在声明常量时,要用到明常量时,要用到constconst关键字,和关键字,和C+C+类似。常量在使类似。常量在使用的过程中,不可以对其进行赋值的改变,否则系统会自用的过程中,不可以对其进行赋值的改变,否则系统会自动报错。动报错。常量声明的基本语法为:常量声明的基本语法为:const int/double/long/bool/string/const int/double/long/bool/string/常量名常量名;下面是一个具体声明常量的例子:下面是一个具体声明常量的例子:const doubl
31、e PI=3.1415926;const double PI=3.1415926;2.3 常量和变量2.3.2 2.3.2 变量变量变量代表了存储单元,每个变量都有一个数据类型。这决变量代表了存储单元,每个变量都有一个数据类型。这决定了这个变量可以存储什么值。在任何一种语言中,变量定了这个变量可以存储什么值。在任何一种语言中,变量的命名都是有一定的规则的,当然的命名都是有一定的规则的,当然 C#.NET C#.NET也不例外,若也不例外,若在使用中定义了不符合一定规则的变量,在使用中定义了不符合一定规则的变量,C#.NETC#.NET语言系语言系统会自动报错。统会自动报错。变量命名规则如下:变
32、量命名规则如下:(1 1)变量名的第一个字符必须是字母、下划线()变量名的第一个字符必须是字母、下划线(_)或)或者者。(2 2)除去第一个字母外,其余的字母可以是字母、数字、)除去第一个字母外,其余的字母可以是字母、数字、下划线的组合。下划线的组合。(3 3)不可以使用对)不可以使用对C#C#编译器而言有特定含义的名字编译器而言有特定含义的名字(即即C#C#语言的库函数名称和关键字名称语言的库函数名称和关键字名称)作为变量名,如作为变量名,如using using、namespace namespace、structstruct等等。等等。2.3 常量和变量2.3.3 变量的作用范围(作用域
33、)变量不但有类型,还有作用范围。变量的作用范围就是应用程序中可以使用和操作变量的部分。变量的作用域和C+类似,分为局部作用域和类作用域。(1)局部作用域方法(即函数)中声明的任何变量都具有那个方法的作用域;一旦方法结束,它们也会消失,而且只能由那个方法内部执行的代码来访问。2.3 常量和变量这些变量称为局部变量这些变量称为局部变量(local variable)(local variable),因为它们局限于,因为它们局限于声明它们的那个方法,不能在其他任何方法中使用。换言声明它们的那个方法,不能在其他任何方法中使用。换言之不能使用局部变量在不同的方法之间共享信息。例如:之不能使用局部变量在不
34、同的方法之间共享信息。例如:class Exampleclass Example void firstMethod()void firstMethod()int myVar;int myVar;.void anotherMethod()void anotherMethod()myVar=42;/myVar=42;/错误错误 变量越界变量越界.2.3 常量和变量(2 2)类作用域)类作用域在类中在类中(但不在一个方法中但不在一个方法中)声明的任何变量都具有那个类声明的任何变量都具有那个类的作用域。例如:的作用域。例如:class Exampleclass Example int myField=
35、0;int myField=0;void firstMethod()void firstMethod()myField=42;/myField=42;/正确正确 .void anotherMethod()void anotherMethod()myField=42;/myField=42;/正确正确.2.4 运算符与表达式2.4.1 2.4.1 运算符运算符运算符指明了进行运算的类型,例如,加号(运算符指明了进行运算的类型,例如,加号(+)用于加)用于加法、减号(法、减号(-)用于减法、星号()用于减法、星号(*)用于乘法、正斜杠)用于乘法、正斜杠(/)则用于除法等。)则用于除法等。1 1算术
36、运算符算术运算符算术运算符包括:算术运算符包括:*(乘法运算符)、(乘法运算符)、/(除法运算符)、(除法运算符)、%(求余运算符,如(求余运算符,如7%3=17%3=1)、)、+(加法运算符)、(加法运算符)、(减(减法运算符)、法运算符)、+(增量运算符)和(增量运算符)和-(减量运算符)。(减量运算符)。2.4 运算符与表达式增量和减量运算符都是单目运算符,运算结果是增量和减量运算符都是单目运算符,运算结果是将操作数增将操作数增1 1或减或减1 1。这两个运算符都有前置和后。这两个运算符都有前置和后置两种形式。前置形式是指运算符在操作数的前置两种形式。前置形式是指运算符在操作数的前面,后
37、置是指运算符在操作数的后面。例如面,后置是指运算符在操作数的后面。例如:a+;/a+;/等价于等价于a=a+1;a=a+1;+a;/+a;/等价于等价于a=a+1;a=a+1;a-;/a-;/等价于等价于a=a-1;a=a-1;-a /-a /等价于等价于a=a-1;a=a-1;2.4 运算符与表达式注意:注意:(1 1)C#C#语言算术表达式的乘号(语言算术表达式的乘号(*)不能省略。例如:)不能省略。例如:数学式数学式b2-4acb2-4ac相应的相应的C+C+表达式应该写成:表达式应该写成:b*b-4*a*cb*b-4*a*c。(2 2)C#C#语言表达式中只能出现字符集允许的字符。例如
38、:语言表达式中只能出现字符集允许的字符。例如:数学数学r2r2相应的相应的C+C+表达式应该写成:表达式应该写成:PI*r*rPI*r*r。(其中。(其中PIPI是是已经定义的符号常量)。已经定义的符号常量)。(3 3)C#C#语言算术表达式只使用圆括号改变运算的优先顺语言算术表达式只使用圆括号改变运算的优先顺序(不要指望用序(不要指望用 或或 )。可以使用多层圆括号,此时)。可以使用多层圆括号,此时左右括号必须配对,运算时从内层括号开始,由内向外依左右括号必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。次计算表达式的值。2.4 运算符与表达式2赋值运算符赋值运算符包括基本赋值运算
39、符()和复合赋赋值运算符包括基本赋值运算符()和复合赋值运算符,复合赋值运算符包括:值运算符,复合赋值运算符包括:=、*=*=、/=/=、=、+=+=、-=-=、=和和&=&=。例如例如:int a=12,x=3,y;int a=12,x=3,y;a+=a;/a+=a;/表示表示 a=(a+a)=(12+12)=24;a=(a+a)=(12+12)=24;y*=x+2;/y*=x+2;/表示表示 y=y*(x+2);y=y*(x+2);而不是而不是y=y*x+2;y=y*x+2;注意:赋值运算符、复合赋值运算符的优先级比注意:赋值运算符、复合赋值运算符的优先级比算术运算符低。算术运算符低。2.
40、4 运算符与表达式3比较运算符(1 1)比较数值。有六种比较运算符可以用于比较)比较数值。有六种比较运算符可以用于比较数值,包括:数值,包括:=(相等)、(相等)、!=!=(不等于)、(不等于)、(小于)、(小于)、=(大于)、(大于)、=(大于或等于)。(大于或等于)。(2 2)is is运算符运算符is is运算符可以检查对象是否与特定的类型兼容。运算符可以检查对象是否与特定的类型兼容。例如,要检查变量是否与例如,要检查变量是否与objectobject类型兼容。类型兼容。2.4 运算符与表达式(3)as运算符asas运算符用于执行引用类型的显式类型转换。如果要转换运算符用于执行引用类型的
41、显式类型转换。如果要转换的类型与指定的类型兼容,转换就会成功进行;如果类型的类型与指定的类型兼容,转换就会成功进行;如果类型不兼容,不兼容,asas运算符就会返回值运算符就会返回值nullnull。如下面的代码所示,。如下面的代码所示,如果如果objectobject引用不指向引用不指向stringstring实例,把实例,把objectobject引用转换为引用转换为stringstring就会返回就会返回nullnull:object o1=Some String;object o1=Some String;object o2=5;object o2=5;string s1=o1 as s
42、tring;/s1=Some Stringstring s1=o1 as string;/s1=Some Stringstring s2=o2 as string;/s1=nullstring s2=o2 as string;/s1=nullasas运算符允许在一步中进行安全的类型转换,不需要先使运算符允许在一步中进行安全的类型转换,不需要先使用用is is运算符测试类型,再执行转换。运算符测试类型,再执行转换。2.4 运算符与表达式4 4字符串连接运算符字符串连接运算符对于两个字符串类型的变量,可以使用对于两个字符串类型的变量,可以使用“+”“+”运算运算符实现字符串的连接。例如:符实现字符
43、串的连接。例如:string strTemp1,strTemp2;string strTemp1,strTemp2;strTemp1=Hello;strTemp1=Hello;strTemp2=World.;strTemp2=World.;MessageBox.Show(strTemp1+strTemp2);MessageBox.Show(strTemp1+strTemp2);当定义了两个字符串型变量当定义了两个字符串型变量strTemp1strTemp1和和strTemp2strTemp2并给它们分别赋值之后,就可以使用第并给它们分别赋值之后,就可以使用第4 4行的行的“+”“+”运算符把它
44、们连接起来,并在中间夹了一个运算符把它们连接起来,并在中间夹了一个空格,形成空格,形成Hello World.Hello World.字符串。字符串。2.4 运算符与表达式5逻辑运算符C#C#中常用的逻辑运算符有:!中常用的逻辑运算符有:!(非非)、&(&(与与)、|(|(或或)。计。计算的结果仍然是布尔类型的算的结果仍然是布尔类型的truetrue或或falsefalse。与:与:C#C#中的符号为中的符号为“&”“&”,表示必须满足两个条件。语法,表示必须满足两个条件。语法为为“表达式表达式1&1&表达式表达式2”2”。或:或:C#C#中的符号为中的符号为“|”“|”,表示满足两个条件中的
45、任意一,表示满足两个条件中的任意一个即可。语法为个即可。语法为“表达式表达式1|1|表达式表达式2”2”。2.4 运算符与表达式6typeof 运算符typeof运算符用于获得系统原型对象的类型,也就是Type对象。常与is运算符连用,用于判断某个变量是否为某一类型。每一个类都有一个GetType方法与它功能很相似。【例2-2】创建控制台程序,演示typeof运算符。2.4 运算符与表达式7new运算符newnew运算符用于创建一个新的类型实例,它有运算符用于创建一个新的类型实例,它有3 3种种形式:形式:(1 1)对象创建表达式,用于创建一个类类型或值)对象创建表达式,用于创建一个类类型或值
46、类型的实例。类型的实例。(2 2)数组创建表达式,用于创建一个数组类型实)数组创建表达式,用于创建一个数组类型实例。例。(3 3)委托创建表达式,用于创建一个新的委托类)委托创建表达式,用于创建一个新的委托类型实例。型实例。2.4 运算符与表达式2.4.2 2.4.2 运算符优先级运算符优先级在一个表达式中出现多种运算时,将按照预先确定的顺序在一个表达式中出现多种运算时,将按照预先确定的顺序计算并解析各个部分,这个顺序称为运算符优先级。计算并解析各个部分,这个顺序称为运算符优先级。C#C#中常用的运算符的优先级见表中常用的运算符的优先级见表2-72-7所示。所示。2.4 运算符与表达式2.4.
47、3 表达式表达式是一个或多个运算的组合。表达式是一个或多个运算的组合。C#C#的表达式与其他语言的表达式与其他语言的表达式没有显著的区别。每个符合的表达式没有显著的区别。每个符合C#C#规则的表达式的规则的表达式的计算都是一个确定的值。对于常量、变量的运算和对于函计算都是一个确定的值。对于常量、变量的运算和对于函数的调用都可以构成最简单的表达式。数的调用都可以构成最简单的表达式。通常表达式涉及的内容包括赋值计算以及真通常表达式涉及的内容包括赋值计算以及真/假判断等。假判断等。一个赋值表达式至少应有一个变量,以及一个赋给变量的一个赋值表达式至少应有一个变量,以及一个赋给变量的值。这里要求所有的变
48、量在使用前都必须初始化,否则值。这里要求所有的变量在使用前都必须初始化,否则C#C#编译器将对未初始化的变量给出警告编译器将对未初始化的变量给出警告。2.5 控制台应用程序与格式化输出 2.5.1 控制台输出 Console.WriteLineConsole.WriteLine()方法将指定的数据(后跟换行符)()方法将指定的数据(后跟换行符)写入标准输出流(屏幕)。写入标准输出流(屏幕)。Console.WriteLineConsole.WriteLine()方法类似于()方法类似于C C语言的语言的printfprintf函数,可函数,可以采用以采用“N,M:“N,M:格式化字符串格式化字
49、符串”的形式来格式化输的形式来格式化输出项,其中的参数含义如下。出项,其中的参数含义如下。花括号花括号:用来在输出中插入变量的值。:用来在输出中插入变量的值。N N:表示输出变量的序号,变量的序号从:表示输出变量的序号,变量的序号从0 0开始。开始。2.5 控制台应用程序与格式化输出表表2-8 2-8 格式化字符串中字母含义格式化字符串中字母含义字母字母含义含义C C或或c cCurrency Currency 货币货币格式格式D D或或d dDecimal Decimal 十十进进制格式(十制格式(十进进制整数)制整数)E E或或e eExponent Exponent 指数格式指数格式F
50、F或或f fFixed point Fixed point 固定精度格式固定精度格式G G或或g gGeneral General 常用格式常用格式N N或或n n用逗号分割千位的数字,比如用逗号分割千位的数字,比如12341234将会被将会被变变成成1,2341,234P P或或p pPercentage Percentage 百分符号格式百分符号格式X X或或x xHex 16Hex 16进进制格式制格式R R或或r rRound-trip Round-trip 圆圆整(只用于浮点数)保整(只用于浮点数)保证证一个数字被一个数字被转转化成字符串以后可以化成字符串以后可以再被再被转转回成同回