1第2章使用变量、操作符和表达式Aftercompletingthischapter,youwillbeableto:Understandstatements,identifiers,andkeywords.Usevariablestostoreinformation.Workwithprimitivedatatypes.Usearithmeticoperatorssuchastheplussign(+)andtheminussign(–).Incrementanddecrementvariables.22.1理解语句语句是能执行一个操作的命令。方法:具名的语句序列。语法:对语句的格式和构成规则进行描述语义:规定一个语句应该做什么的规范最简单也是最重要的一个C#语法规则是:必须用一个分号来终止所有的语句3一个交互式的HelloWorld程序01://ThisisasimpleC#program02:classHello03:{04://TheprogrambeginswithacalltoMain()05:publicstaticvoidMain()06:{07:stringanswer;08:09:System.Console.WriteLine(Doyouwantmetowritethetwowords?);10:System.Console.WriteLine(Typeyforyes;nforno.Thenenter);11:answer=System.Console.ReadLine();12:if(answer==y)13:System.Console.WriteLine(HelloWorld!);14:System.Console.WriteLine(ByeBye!);15:}16:}01说明注释:注释对源代码很有用。它们与源代码中的其他元素同样重要。它们不仅能让其他人理解你的代码,还能作为你在今后重新查看源代码时的提示。classHello//ThisisasimpleC#program//ThisisasimpleC#programclassHello02说明03说明05说明09说明11说明07说明一些基本知识C#是一种“自由格式”的语言空行、空字符、tab键、回车统称为空格,仅充当分隔符,c#编译器将忽略。不要用空格分开记号publicstaticvoidMain()publicstaticvoidMain()publicstaticvoidMain()源代码样式:一行一条语句(如7、9、10、11和14行)。不过,if语句是一个例外。它必须用多行表达在输入一个左括号{后,移到下一行并缩进(第4行和第7行)。匹配的括号缩进度要相同(第3和第16行、第6和第15行)。在遵守前面几条的前提下,匹配括号内的语句缩进量也相同(第4、5行及7-14行)if条件后面的语句必须缩进(第13行)。源代码中明显的逻辑部分用空行隔开(第8行)。不要在函数名与圆括号的中间使用空格(第5行)2.4使用基本数据类型C#内建了大量基本数据类型具体见课本P2918TheSimpleTypesinC#C#Keyword.NETCTSTypeKindOfValue占用内存RangeandPrecisionsbyteSystem.SByteInteger8bits-128to127byteSystem.ByteInteger8bits0to255shortSystem.Int16Integer16bits-32768to32767ushortSystem.UInt16Integer16bits0to65535intSystem.Int32Integer32bits-2147483648to2147483647uintSystem.UInt32Integer32bits0to4294967295longSystem.Int64Integer64bits-9223372036854775808to9223372036854775807ulongSystem.UInt64Integer64bits0to18446744073709551615charSystem.CharInteger(Singlecharacter)16bitsAllUnicodecharactersfloatSystem.Singlefloatingpoint32bits(+/-)1.5x10-45to(+/-)3.4x1038约7个有效位doubleSystem.Doublefloatingpoint64bits(+/-)5.0x10-324to(+/-)3.4x103015?6significantdigitsdecimalSystem.DecimalHighprecisiondecimalnumber128bits(+/-)1.0x10-28to(+/-)7.9x1028boolSystem.Booleantrueorfalse8bitNotapplicable溢出原值可能超过了最终类型的上限,这称为溢出(overflow)300赋值给byte原值小于最终类型的下限,导致下溢(underflow)-40000赋值给short类型的变量隐式转换路径C#中的两种浮点数类型float、double缺省情况下,为double,要制定一个float类,必须在该数后面加f(或F)floatdistance;distance=8.24E8;必须显式表示后缀f浮点数的相等性01:usingSystem;02:03:classNonEquality04:{05:publicstaticvoidMain()06:{07:doublemySum;08:09:mySum=0.2f+0.2f+0.2f+0.2f+0.2f;10:if(mySum==1.0)11:Console.WriteLine(mySumisequalto1.0);12:Console.WriteLine(mySumholdsthevalue+mySum);13:}14:}mySumholdsthevalue1.0000000149011612运行结果避免在浮点数间应用相等比较操作符,如果一定要比较,可以允许一定的精度误差。例如:if(Math.Abs(mySum-1.0)0.0001)01:usingSystem;02:03:classDifferentMagnitudes04:{05:publicstaticvoidMain()06:{07:floatdistance=1234567000f;08:09:distance=distance-5f;10:Console.WriteLine(Newdistance:+distance);11:}12:}Newdistance:1.234567E+09注意:浮点值间的加减不应该针对不同数量级的数decimal类型精度更高范围较小占用存储空间较多浮点、decimal和整数值的兼容性float可以隐式转换成double,不能从double转换成float浮点类型比decimal范围大,decimal具有更高的有效位,不能相互转换整数可以转换成浮点数或decimal显示类型转换技巧:在整个代码中对所有常数使用一个命名后的常量,不要在某些地方使用命名的常量,而在另外一些地方保持字面值不变例如:MaxSpeed=200常量的不一致可能产生错误使用常量的优点:理解一个值的意义需要修改时,只需要更改一个地方bool类型bool类型值:true、false都是C#的关键字boolisFinished;isFinished=true;从string类型转换为int类型任何被Console.ReadLine接受的、在控制台输入的用户反应在C#中都是string类型Convert类一元操作符一元操作符仅用于一个操作数当一元减操作符用于一个变量时,它不会改变变量所表示的值,它只是改变从此变量返回的值自增和自减操作符前缀形式:++count将变量的值加1返回变量的值后缀形式:count--返回变量的值将变量的值减1常量不可以使用:20++Library.cs01:usingSystem;02:03:classLibrary04:{05:publicstaticvoidMain()06:{07:intnumProgrammingBooks=2;08:intnumStatisticsBooks=1;09:intnumActionBooks=504;10:inttotalBooks;11:12:totalBooks=++numActionBooks+numProgrammingBooks+13:numStatisticsBooks;14:Console.WriteLine(Numberofactionbooks:+15:numActionBooks);16:Console.WriteLine(Totalnumberofbooks:+17:totalBooks);18:}19:}判断表达式的类型:操作符如何来影响数字表达式在下面情况下,自动类型转换由C#编译器执行:某类型的值赋予一个其他类型的变量,并在两种类型间存在隐式转换路径。方法调用中,参数传递给一个方法,在参数和形式参数间存在隐式转换路径特定的操作符作用于特定的类型值。不同类型混合存在于一个表达式中。在内部,C#支持使用一元加和减操作符作用于int、uint、long、ulong、float、double、decimal类型的数;byte、sbyte、short、ushort类型除外。你仍然可以对后面的整数类型使用一元操作符。不过,在这种情况下,它将强迫C#换成它能处理的最接近类型,这就是int。所以,无论什么时候你对byte、sbyte、short、ushort类型值使用一元加或一元减操作符时,操作符返回的值都是int类型。数字提升当从一种类型转换成另一种类型,且转换后的范围拓宽和(或)精度提高时,就可称作数字提升一元加、一元减用于byte、sbyte、short、ushort,都是数字提升。一元加操作符用于uint类型,表达式的值为long。在一个表达式中组合不同的类型decimalandshortdoubleanddecimalshortandulongbyteandshort数值类型和无穷大任何数除以0所得结果都是无穷大,不在int,long,和decimal之列5/0结果错误但是double和float类型有一个可以表示无穷大的特殊值:正无穷大如果0.0/0,结果为NaN,非数字如果计算10+Infinity,结果为Infinity表达式Infinity*0,结果为0NaN*0,结果为NaN422.7声明隐式类型的局部变量C#中声明变量一般需要指定数据类型,使用之前必须赋值也允许声明变量时先不指定类型,由编译器根据表达式推断变量的类型var关键字例如varmyVariable=99;varmyOtheVariable=“Hello”;myVariable和myOtherVariable称为隐式类型变量var关键字指示编译器根据用于初始化的表达式来推断变量的类型注意:变量一旦声明,就只能将编译器推断的那种类型的值赋给它,不能将float,double等赋值给myVariable只有在提供了一个表达式来初始化变量的时候,才能使用var除非万不得已,不要使用隐式类型变量本章结束45