c数据类型与流程控制_第1页
c数据类型与流程控制_第2页
c数据类型与流程控制_第3页
c数据类型与流程控制_第4页
c数据类型与流程控制_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

第2章数据类型与流程控制

2.1数据类型

2.1.1C#数据类型的分类为了方便识别和处理,编程语言系统中的不同信息在计算机中具有不同的表示,占用不同的储存空间,这些信息在语言系统中称之为数据类型。C#中的数据类型和C++是类似的。但在C#中数据类型分为两种:值类型和引用类型,如图2-1所示。值类型包括一些数值类型(例如int和float)、char、枚举类型和结构类型。引用类型包括类、接口、委托(delegate)和数组类型。在C#中,内置数据类型除了字符串(string)类型与对象(object)类型外,其余均为值类型。2.1数据类型C#中的数据类型的划分如图2-1所示。2.1数据类型值类型和引用类型的区别在于:值类型变量直接存储在堆栈中,且占用空间大小相对固定,变量直接包含他们的数据,可以直接访问其值,访问速度快;而引用类型数据需要通过存储在栈中的引用来间接访问其值,实际内容存储在内存的堆中,占用空间大小不固定,访问速度慢。表2-1所示为值类型和引用类型的区别。

特性值类型引用类型变量中保存的内容实际数据指向实际数据的引用指针内存空间配置堆栈受管制的堆内存需求较少较多执行效率较快较慢内存释放时间点执行超过定义变量的作用域时由垃圾回收机制负责回收2.1数据类型1.整数类型整数类型(也叫整型)表示无小数部分的数字。根据变量在内存中所占的位数不同,C#将整型分为8种:字节型(sbyte)、无符号字节型(byte)、短整型(short)、无符号短整型(ushort)、整型(int)、无符号整型(uint)、长整型(long)、无符号长整型(ulong)。整型的说明及示例如表2-2所示。2.1数据类型表2-2整数类型的关键字及说明关键字.NET类型说明示例sbyteSystem.Sbyte8位有符号整型,取值-128~127sbyteval=12;byteSystem.Byte8位无符号整型,取值0~255shortval=12;intSystem.Int3232位有符号整型,取值-231~231-1intval=12;uintSystem.UInt3232位无符号整型,取值0~232-1uintval1=12;uintval2=32U;shortSystem.Int1616位有符号整型,取值-215~215-1shortval1=12;ushortSystem.UInt1616位无符号整型,取值0~216-1ushortval1=12;longSystem.Int6464位有符号整型,取值-263~263-1longval1=12;longval2=12L;ulongSystem.UInt6464位无符号整型,取值0~264-1ulongval1=23;ulongval2=23U;ulongval3=56L;2.1数据类型2.实数类型C#中的实数类型有3种:float、double、decimal。其中double的取值范围最广,decimal取值范围其次,但它的精度高。具体见表2-3。表2-3实数类型的关键字及说明关键字.NET类型说明示例floatSystem.Float32位单精度浮点型,±1.5×10-45~3.4×1038,精度为7位floatval=12.3F;doubleSystem.Double64位双精度浮点型,±5.0×10-324~1.7×10308,精度为15~16位doubleval=23.12D;decimalSystem.Decimal128位小数类型,1.0×10-28到~7.9×1028精度为28~29位decimalval=1.23M;2.1数据类型3.字符类型和字符串类型字符类型也叫字符型,用char表示,为单个Unicode字符,一个Unicode字符的标准长度为两个字节,它在机器中占16位,其范围为0~65535。字符一般是用单引号括起来的一个字符,如:'a','A',也可以写成转义字符、十六进制转换码或Unicode表示形式。此外,整数也可以显式地转换为字符。2.1数据类型常用的转义字符如表2-4所示。转义符字符名字符的Unicode值转义符字符名字符的Unicode值\'单引号0x0027\f换页0x000c\"双引号0x0022\n新行0x000A\\反斜杠0x005c\r回车0x000D\0空字符0x0000\t水平制表符0x0009\a警告(产生蜂鸣)0x0007\v垂直制表符0x000B\b退格0x00082.1数据类型4.布尔类型布尔型主要用于逻辑判断,这种类型的数据只有true和false两个值。在C++中,false相当于0,true相当于1。但在C#中,废弃了这种不正规的表达方式,true值不能被任何非零值取代,将整数类型转换为布尔类型是不合法的。例如:boolx=1;//错误,不存在这种写法booly=1;//错误,不存在这种写法boolx=true;//正确,可以被执行2.1数数据类型型5.枚举类型型枚举类型是是值类型的的一种特殊殊形式,它它从System.Enum继承而来,,并为基础础类型的值值(如Byte、Int32或UInt64)提供替代代名称。枚枚举类型也也是一种自自定义数据据类型,它它允许用符符号代表数数据。枚举举是指程序序中某个变变量具有一一组确定的的值,通过过“枚举””可以将其其值一一列列出来。enum关关键字用于于声明枚举举类型,基基本格式如如下:enum枚举类型名名{由逗号分隔隔的枚举数数标识符};2.1数数据类型型【例2-1】枚举类类型示例。。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceex01{classProgram{enumweek{monday,tuesday,wednesday,thursday,friday,saturday,sunday};staticvoidMain(string[]args){weekday=week.thursday;inta=(int)day;intb=(int)week.sunday;Console.WriteLine("a={0},b={1}",a,b);Console.ReadLine();}}}2.1数数据类型型6.结构类型型结构类型是是用户自己己定义的一一种类型,,它是由其其他类型组组合而成的的,可包含含构造函数数、常数、、字段、方方法、属性性、索引器器等。结构构与类不同同在于结构构为值类型型而不是引引用类型,,并且结构构不支持继继承。结构构类型将在在第4章讲讲解。2.2不不同数据据类型之间间的转换2.2.1显式转转换与隐式式转换1.隐式式转换C#是一个个强类型的的语言,它它的数值类类型有一些些可以进行行隐式转换换,其他的的必须显式式转换,隐隐式转换的的类型只能能是长度短短的类型转转换成长的的类型(见见表2-5所示),,例如int可以转转换成long,float,double,,decimal;;反之必须须显式的转转换。例如如:inta=7;floatb=a;//隐式转换a=(int)c;//显示转换2.2不不同数据据类型之间间的转换表2-5C#中中支持的隐隐式转换源类型目标类型sbyteshort、int、long、float、double、decimalbyteshort、ushort、int、uint、long、ulong、float、double、decimalshortint、long、float、double、decimalushortint、uint、long、ulong、float、double、decimalintlong、float、double、decimaluintlong、ulong、float、double、decimallongfloat、double、decimalulongfloat、double、decimalcharushort、int、uint、long、ulong、float、double、decimalfloatdouble2.2不不同数据据类型之间间的转换2.显式式转换显式转换又又叫强制类类型转换,,与隐式转转换相反,,显式转换换需要用户户明确地指指定转换类类型,一般般在不存在在该类型的的隐式转换换时才使用用。格式如如下:(类型标识识符)表达达式其作用是将将“表达式式”值的类类型转换为为“类型标标识符”的的类型。例例如:(int)1.23//把double类类型的1.23转换换成int类型,结结果为12.2不不同数据据类型之间间的转换使用上面的的显示转换换不能用在在bool和string类类型上,如如果希望string或者bool类类型和整数数类型之间间的转化可可以使用一一个方法Convert。格格式如下::Convert.方方法名(参数)方法名是To数据类类型形式,,具体含义义见表2-6。2.2不不同数据据类型之间间的转换表2-6Convert.方法含含义方法名含义ToBoolean将数据转换成Boolean类型ToDataTime将数据转换成日期时间类型ToInt16将数据转换成16位整数类型ToInt32将数据转换成32位整数类型ToInt64将数据转换成64位整数类型ToNumber将数据转换成Double类型ToObject将数据转换成Object类型ToString将数据转换成string类型ToBoolean将数据转换成Boolean类型2.2不不同数据据类型之间间的转换2.2.2装箱箱和拆箱对于值类型型和Object类类型之间的的转换,可可以用装箱箱技术和拆拆箱技术来来实现。C#中的任任何类型的的值都可以以按照对象象来处理,,使用object类型的通通用库(如如.NETFramework中的的集合类))既可以用用于引用类类型,又可可以用于值值类型。(1)Object类Object类是所所有类的基基类,它是是System命名名空间下的的一个类,,C#中所所有的类型型都是直接接或间接地地从Object类类继承而来来。因为它它是所有对对象的基类类,所以可可把任何类类型的值赋赋给它,例例如,一个个整型:objecttheObj=123;2.2不不同数据据类型之间间的转换1.装箱箱转换装箱转换是是指将一个个值类型的的数据隐式式地转换成成一个对象象类型的数数据。把一一个值类型型装箱,就就是创建一一个object类型的实实例,并把把该值类型型的值复制制给这个object实例例。例如,,下面语句句就执行了了装箱转换换:inti=123;objectobj=i;//装箱箱转换2.2不不同数据据类型之间间的转换上面的两条条语句中,,第1条语语句先声明明一个整型型变量i并并对其赋值值,第2条条语句则先先创建一个个object类类型的实例例obj,,然后将i的值复制制给obj。装箱操操作过程如如图2-2所示。在执行装箱箱转换时,,也可以使使用显式转转换,如::objectobj=(object)i;2.2不不同数据据类型之间间的转换2.拆箱箱转换拆箱转换是是指将一个个对象类型型的数据显显式地转换换成一个值值类型数据据。例如,,下面语句句就执行了了拆箱转换换:inti=123;objectobj=i;intj=(int)obj;//拆箱转换拆箱操作的的过程如图图2-3所所示。拆箱箱转换需要要(而且必必须)执行行显式转换换,这是它它与装箱转转换的不同同之处。2.3常常量和变变量2.3.1常量量常量就是值值在程序整整个生命周周期内值始始终不变的的量。在声声明常量时时,要用到到const关键字字,和C++类似。。常量在使使用的过程程中,不可可以对其进进行赋值的的改变,否否则系统会会自动报错错。常量声明的的基本语法法为:const[int/double/long/bool/string/………]常量名;下面是一个个具体声明明常量的例例子:constdoublePI=3.1415926;2.3常常量和变变量2.3.2变量量变量代表了了存储单元元,每个变变量都有一一个数据类类型。这决决定了这个个变量可以以存储什么么值。在任任何一种语语言中,变变量的命名名都是有一一定的规则则的,当然然C#.NET也也不例外,,若在使用用中定义了了不符合一一定规则的的变量,C#.NET语言系系统会自动动报错。变量命名规规则如下::(1)变量量名的第一一个字符必必须是字母母、下划线线("_")或者"@"。(2)除去去第一个字字母外,其其余的字母母可以是字字母、数字字、下划线线的组合。。(3)不可可以使用对对C#编译译器而言有有特定含义义的名字(即C#语语言的库函函数名称和和关键字名名称)作为为变量名,,如using、、namespace、struct等等。。2.3常常量和变变量2.3.3变量量的作用范范围(作用用域)变量不但有有类型,还还有作用范范围。变量量的作用范范围就是应应用程序中中可以使用用和操作变变量的部分分。变量的的作用域和和C++类类似,分为为局部作用用域和类作作用域。(1)局部部作用域方法(即函函数)中声声明的任何何变量都具具有那个方方法的作用用域;一旦旦方法结束束,它们也也会消失,,而且只能能由那个方方法内部执执行的代码码来访问。。2.3常常量和变变量这些变量称称为局部变变量(localvariable),因为为它们局限限于声明它它们的那个个方法,不不能在其他他任何方法法中使用。。换言之不不能使用局局部变量在在不同的方方法之间共共享信息。。例如:classExample{voidfirstMethod(){intmyVar;...}voidanotherMethod(){myVar=42;//错误–变量越界...}}2.3常常量和变变量(2)类作作用域在类中(但但不在一个个方法中)声明的任任何变量都都具有那个个类的作用用域。例如如:classExample{intmyField=0;voidfirstMethod(){myField=42;//正确...}voidanotherMethod(){myField=42;//正确...}}2.4运运算符与与表达式2.4.1运算算符运算符指明明了进行运运算的类型型,例如,,加号(+)用于加加法、减号号(-)用用于减法、、星号(*)用于乘乘法、正斜斜杠(/))则用于除除法等。1.算术运运算符算术运算符符包括:*(乘法法运算符))、/(除除法运算符符)、%((求余运算算符,如7%3=1)、+((加法运算算符)、——(减法运运算符)、、++(增增量运算符符)和--(减量运运算符)。。2.4运运算符与表达达式增量和减量运运算符都是单单目运算符,,运算结果是是将操作数增增1或减1。。这两个运算算符都有前置置和后置两种种形式。前置置形式是指运运算符在操作作数的前面,,后置是指运运算符在操作作数的后面。。例如:a++;//等价于a=a+1;++a;//等价于a=a+1;a--;//等价于a=a-1;--a//等等价于a=a-1;2.4运运算符与表达达式注意:(1)C#语语言算术表达达式的乘号((*)不能省省略。例如::数学式b2-4ac相相应的C++表达式应该该写成:b*b-4*a*c。(2)C#语语言表达式中中只能出现字字符集允许的的字符。例如如:数学πr2相应的C++表达式式应该写成::PI*r*r。(其中中PI是已经经定义的符号号常量)。(3)C#语语言算术表达达式只使用圆圆括号改变运运算的优先顺顺序(不要指指望用{}或或[])。。可以使用多多层圆括号,,此时左右括括号必须配对对,运算时从从内层括号开开始,由内向向外依次计算算表达式的值值。2.4运运算符与表达达式2.赋值运算算符赋值运算符包包括基本赋值值运算符(==)和复合赋赋值运算符,,复合赋值运运算符包括::^=、*=、/=、\=、+=、、-=、<<=、>>=和&=。例如:inta=12,x=3,y;a+=a;//表示a=(a+a)=(12+12)=24;y*=x+2;//表示y=y*(x+2);而不是y=y*x+2;注意:赋值运运算符、复合合赋值运算符符的优先级比比算术运算符符低。2.4运运算符与表达达式3.比较运算算符(1)比较数数值。有六种种比较运算符符可以用于比比较数值,包包括:==(相等)、、!=(不等等于)、<((小于)、<=(小于或或等于)、>(大于)、、>=(大于于或等于)。。(2)is运算符符is运算符可可以检查对象象是否与特定定的类型兼容容。例如,要要检查变量是是否与object类型型兼容。2.4运运算符与表达达式(3)as运运算符as运算符用用于执行引用用类型的显式式类型转换。。如果要转换换的类型与指指定的类型兼兼容,转换就就会成功进行行;如果类型型不兼容,as运算符就就会返回值null。如如下面的代码码所示,如果果object引用不指指向string实例,,把object引用转转换为string就会会返回null:objecto1="SomeString";objecto2=5;strings1=o1asstring;//s1="SomeString"strings2=o2asstring;//s1=nullas运算符允允许在一步中中进行安全的的类型转换,,不需要先使使用is运算算符测试类型型,再执行转转换。2.4运运算符与表达达式4.字符串连连接运算符对于两个字符符串类型的变变量,可以使使用“+”运运算符实现字字符串的连接接。例如:stringstrTemp1,strTemp2;strTemp1="Hello";strTemp2="World.";MessageBox.Show(strTemp1+""+strTemp2);当定义了两个个字符串型变变量strTemp1和和strTemp2并给给它们分别赋赋值之后,就就可以使用第第4行的“+”运算符把把它们连接起起来,并在中中间夹了一个个空格,形成成"HelloWorld."字字符串。2.4运运算符与表达达式5.逻辑运算算符C#中常用的的逻辑运算符符有:!(非非)、&&(与)、||(或)。计计算的结果仍仍然是布尔类类型的true或false。与:C#中的的符号为“&&”,表示示必须满足两两个条件。语语法为“表达达式1&&表达式2”。或:C#中的的符号为“||”,表示示满足两个条条件中的任意意一个即可。。语法为“表表达式1||表达式式2”。2.4运运算符与表达达式6.typeof运算算符typeof运算符用于于获得系统原原型对象的类类型,也就是是Type对对象。常与is运算符连连用,用于判判断某个变量量是否为某一一类型。每一一个类都有一一个GetType方法法与它功能很很相似。【例2-2】】创建控制台台程序,演示示typeof运算符。。2.4运运算符与表达达式7.new运运算符new运算符符用于创建一一个新的类型型实例,它有有3种形式::(1)对象创创建表达式,,用于创建一一个类类型或或值类型的实实例。(2)数组创创建表达式,,用于创建一一个数组类型型实例。(3)委托创创建表达式,,用于创建一一个新的委托托类型实例。。2.4运运算符与表达达式2.4.2运运算符优优先级在一个表达式式中出现多种种运算时,将将按照预先确确定的顺序计计算并解析各各个部分,这这个顺序称为为运算符优先先级。C#中中常用的运算算符的优先级级见表2-7所示。2.4运运算符与表达达式2.4.3表表达式表达式是一个个或多个运算算的组合。C#的表达式式与其他语言言的表达式没没有显著的区区别。每个符符合C#规则则的表达式的的计算都是一一个确定的值值。对于常量量、变量的运运算和对于函函数的调用都都可以构成最最简单的表达达式。通常表达式涉涉及的内容包包括赋值计算算以及真/假假判断等。一一个赋值表达达式至少应有有一个变量,,以及一个赋赋给变量的值值。这里要求求所有的变量量在使用前都都必须初始化化,否则C#编译器将对对未初始化的的变量给出警警告。2.5控控制台应用程程序与格式化化输出2.5.1控控制台输输出Console.WriteLine()方法法将指定的数数据(后跟换换行符)写入入标准输出流流(屏幕)。。Console.WriteLine()方法法类似于C语语言的printf函数数,可以采用用“{N[,M][:格格式化字符串串]}”的形形式来格式化化输出项,其其中的参数含含义如下。花括号{}::用来在输出出中插入变量量的值。N:表示输出出变量的序号号,变量的序序号从0开始始。2.5控控制台应用程程序与格式化化输出表2-8格格式化字符符串中字母含含义字母含义C或cCurrency货币格式D或dDecimal十进制格式(十进制整数)E或eExponent指数格式F或fFixedpoint固定精度格式G或gGeneral常用格式N或n用逗号分割千位的数字,比如1234将会被变成1,234P或pPercentage百分符号格式X或xHex16进制格式R或rRound-trip圆整(只用于浮点数)保证一个数字被转化成字符串以后可以再被转回成同样的数字2.5控控制台应用程程序与格式化化输出2.5.2控制台输入Console.ReadLine()方法从标标准输入流((键盘)读取取下一行字符符。例如:Stringname=Console.ReadLine();由于ReadLine方方法只能输入入字符串,为为了输入数值值,需要进行行数据类型的的转换。C#中每种数据据类型都是一一个结构,它它们都提供了了Parse方法,以用用于将数字的的字符串表示示形式转换为为等效数值。。2.5控控制台应用程程序与格式化化输出2.5.3字字符串的的格式化输出出字符串格式String.Format作用是是形成格式化化的字符串,,它和WriteLine都遵守同同样的格式化化规则,采用用“{N[,M][:格格式化字符串串]}”的形形式来格式化化输出字符串串。格式化字字符串中字母母含义见表2.5。例如如:Strings=String.Format("123");Stringt=String.Format("{0}",123);Stringu=String.Format("{0:D3}",123);Console.WriteLine(s);Console.WriteLine(t);Console.WriteLine(u);2.6C#流程控制制语句2.6.1选选择语句句选择语句(条条件语句)主主要包括两种种类型,分别别为if语句句和switch语句。。1.if语句句if语句是最最常用的选择择语句,它的的功能是根据据所给定的条条件(常由关关系、布尔表表达式表示)是否满足,,决定是否执执行后面的操操作。常用的的if语句表表达形式有3种:(1)if语语句if(表达式){语句块};功能:如果表表达式的值为为真(即条件件成立),则则执行if语语句所控制的的语句块;(2)if……else语句if(表达式){语句组1}else{语句组2}2.6C#流程控制制语句(3)嵌套if语句if语句中中,如果内嵌嵌语句又是if语句,就就构成了嵌套套if语句。。if语句可可实现二选一一分支,而嵌嵌套if语句句则可以实现现多选一的多多路分支情况况。if(表达达式1){语句组1}elseif(表达达式2){语句组2}elseif(表达达式3){语句组3}……elseif(表达式n-1){语句组n-1}else{语句组n}2.6C#流程控制制语句2.switch语句当分支情况很很多时,虽然然if-else-if语句可以实实现,但多层层的嵌套使程程序变得冗长长且不直观。。针对这种情情况,C#与与C/C++一样,也提提供了switch语句句,用于处理理多分支的选选择问题。switch语句的一般般形式:switch(表达式){case常量表达式1:语句组1;break;case常量表达式2:语句组2;break;……case常量表达式n:语句组n;break;default:语句组n+1;break;}2.6C#流程控制制语句其中:“常量表达式式”是“表达达式”的计算算结果,可以以是整型数值值、字符或字字符串。switch语语句的执行过过程:(1)首先计计算switch后面的的表达式的值值。(2)将上述述计算出的表表达式的值依依次与每一个个case语语句的常量表表达式的值比比较。如果没没有找到匹配配的值,则进进入default,执执行语句组n+1;如果果没有default,,则执行switch语语句后的语句句;如果找到到匹配的值,,则执行相应应的case语句组语句句,执行完该该case语语句组后,整整个switch语句也也就执行完毕毕。因此,最最多只执行其其中的一个case语句句组,然后将将执行switch语句句后的语句。。2.6C#流程控制制语句使用switch语句时时需要注意以以下几点:(1)switch条件件表达式的值值和每个case后面的的常量表达式式可以是string、、int、char、enum或其其他类型。特特别是常量表表达式可以是是string类型,给给程序员的开开发带来了很很大方便。(2)每个case的语语句序列可以以用大括号括括起来,也可可以不括起来来,但是case块的的最后一个语语句一定是break语语句,否则在在编译时将产产生错误。(3)当找到到符合条件表表达式值得case语句句时,如果其其后有语句序序列,则它只只会执行此case中的的语句序列,,不会再对其其他的case标记进行行判断。但是是,如果某个个case块块为空,则会会从这个case块直接接跳到下一个个case块块。2.6C#流程控制制语句2.6.2循循环语句句C#中的3种种循环语句::for,while,,do…while和C++中是相相同的。但是是C#中添加加了一种循环环语句foreach,,在对数组的的输出方面的的使用非常灵灵活。1.while语句句while语句是最最常见的、、用于执行行重复程序序代码的语语句,在循循环次数不不固定时相相当有效。。其声明语语法如下::while(表达式){循环体}2.6C#流程程控制语句句2.dowhile语句dowhile循循环与while循循环类似,,只要条件件表达式为为true,循环体体就会不断断地重复执执行,但dowhile语语句会先执执行一次循循环体,然然后判断条条件表达式式是true或false。。它对应的的循环体执执行一次((至少一次次)或若干干次。其声明语法法如下:do{循环体}while(条件表达式式);2.6C#流程程控制语句句【例2-6】创建控控制台程序序,输入两两个正整数数,求它们们的最大公公约数。分析:求最最大公约数数可以用““辗转相除除法”,方方法如下::(1)比较较两数,并并使m大于于n。(2)将m作被除数数,n作除除数,相除除后余数为为r。

温馨提示

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

评论

0/150

提交评论