面向对象和组件的C编程科学出版社.ppt

上传人:本田雅阁 文档编号:3223496 上传时间:2019-08-02 格式:PPT 页数:71 大小:1.41MB
返回 下载 相关 举报
面向对象和组件的C编程科学出版社.ppt_第1页
第1页 / 共71页
面向对象和组件的C编程科学出版社.ppt_第2页
第2页 / 共71页
面向对象和组件的C编程科学出版社.ppt_第3页
第3页 / 共71页
面向对象和组件的C编程科学出版社.ppt_第4页
第4页 / 共71页
面向对象和组件的C编程科学出版社.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《面向对象和组件的C编程科学出版社.ppt》由会员分享,可在线阅读,更多相关《面向对象和组件的C编程科学出版社.ppt(71页珍藏版)》请在三一文库上搜索。

1、面向对象和组件的C#编程 科学出版社,第二章 程序结构、变量、类型、运算符,李 军 武汉大学 测绘学院 “我成长”网站 ,第二章 程序结构、变量、类型、运算符,程序结构,变量、常量和字量,类型,运算符,运算符的优先级和结合性,2.1 程序结构,在1.7节,我们编写了一个Hello控制台程序,代码如下。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace HelloApp class Program static void Main(string args)

2、 Console.WriteLine(“Hello!“); ,最简单的Hello控制台程序代码,上面就是最简单的Hello控制台程序代码吗? 其实代码还可简化成下面的形式: class Program static void Main() System.Console.WriteLine(“Hello!“); 它没有了前面四条using语句, 也没有了namespace,Main()中也没有参数; 但在Console前添加了“System.”。 它才是最简单的Hello控制台程序代码!,2.1.1 用类比理解程序结构,房屋好比是类class,房屋名称为HappyHouse; 房屋入口是类中的M

3、ain()函数。 房主拥有的那块土地称为myLand, 它由namesapce定义: namespace myLand class HappyHouse static void Main() System.Console.WriteLine(“Hello!“); ,类比,1) WriteLine可类比为其它土地(System)中房屋(Console)里面的某个东西,用代码表示为: 土地.房屋.东西; 2) 小数点“.”表示访问操作,例如myLand.HappyHouse.Main() 表示: 访问myLand中HappyHouse的Main成员。 HappyHouse房主并没有定义WriteL

4、ine, 但并不妨碍他借用别人的东西。 他在Main中就借用了基类库BCL的函数: System.Console.WriteLine();,2.1.2 命名空间,用C#的术语说,namespace关键字定义了命名空间, 大括号中的东西称为类型,语法如下: namespace 空间名称 定义类型 大括号界定了范围。空间名称要唯一,否则无法界定命名空间中的类型。 类型中定义的东西称为成员。如下所示: namespace 空间名称 类型1 成员 类型2 成员 . ,命名空间-一个分组符号,namespace 说明HelloApp是本项目的命名空间。 命名空间就是一个程序集内相关类型的一个分组符号。

5、System 内建数据、数学计算、垃圾收集器 System.Drawing 处理图形和绘图,包括打印 System.Data 处理数据存取和管理, ADO.NET System.IO 管理对文件和流的同步和异步访问System.Windows 处理基于窗体的窗口的创建System.Reflection 包含从程序集读取元数据的类System.Threading 包含用于多线程编程的类 System.Collections 包含定义各种对象集的接口和类,程序集、命名空间、类型和成员,一个程序集可以包含任意个命名空间, 每个命名空间又可以包含多种类型。 用“对象浏览器”可见: 程序集只有一个Hel

6、loApp命名空间, 命名空间中的类型是Program类(class),Object是Program的基类;右边是Object类的成员。,分析下面代码,namespace HelloApp /命名空间 int a; /定义变量:错误! static void Main() /定义函数:错误! class Program ,2.1.3 引用using,“引用”反映了C#编程的组件思想: 尽可能使用基类库或其它成熟的程序集。 using System; 说明了HelloApp项目引用(using)了System命名空间。 System命名空间中,提供了大量核心的类型, 如System.Int32、

7、string等类型,定义在内部程序集中 。 using简化了对特定命名空间中类型的引用方法。 因为引用了System,所以编译器能够将Console类解析为这个命名空间的成员。如果没有引用System,将出现一个编译器错误。也可以使用完全限定名来使用Console类的函数: System.Console.WriteLine(“Hello!“);,系统自动添加的引用-内部程序集,许多核心的.NET命名空间包含在mscorlib.dll文件中。多数.NET Framework程序集都位于全局程序集缓存GAC的特定目录下(默认下C:WindowsAssembly)。在创建本项目时,系统自动添加了一些

8、全局程序集的引用, 对它们的引用,仅仅通过using关键字来指定命名空间即可。,引用外部程序集(do it),不在上图中列出的程序集,都是外部程序集。 对外部程序集,除了通过using关键字来指定命名空间,还需要告诉C#编译器包含引用类型的程序集的名字。 例如,System.Drawing.Bitmap类型包含在另一个名为System.Drawing.dll的程序集中。引用它的方法如下: 右键点击【引用】【添加引用】, 然后在对话框中选择System.Drawing组件; 见下图。,添加System.Drawing.dll程序集,在Program.cs代码前添加:,using System.D

9、rawing; 你就可以在项目中添加图形类型的具体引用了, 例如在Main()中加上语句: Bitmap Map =new Bitmap(20, 20); Bitmap是System.Drawing命名空间中的一个类。 Map是Bitmap类型的变量, 通过Map =new Bitmap(20, 20); 语句被赋值为Bitmap对象;即调用Bitmap类的构造函数Bitmap(20, 20)来创建的一个对象。 也可说Map是用new实例化的一个Bitmap对象。 注:命名空间与程序集一般是对应的,命名空间为*, 它的程序集名字就为*.dll。,2.1.4 格式化输出,在Main()中添加语句

10、: Console.WriteLine(“0, 1“, “Hello“, “World!“ ); 系统输出: “Hello, World!”字符串。 0、1标记嵌入在字符串中, 它是格式化输出方法, 与C语言的printf()相似。 可以使用这种花括号在文本内部指定占位符。 在运行时,值会传入到WriteLine()来替代每一个占位符。,数据的位置索引,可以在字符串文本的任意位置放置占位符,而不需要按照递增的次序。例如代码: Console.WriteLine(“1+0+2=3“, 10, 20, 30, 60); / 数据的位置索引 0 1 2 3 / 输出:20+10+30=60 后面数据

11、 10,20,30,60 的位置索引总是依递增次序0,1,2,3;而占位符n中的n只能是03, 0表明在占位符0上接受的是索引为0的数据(即10), 1上接受的是索引为1的数据(即20); 而0排在1的后面,故10在20的后面显示。,格式化数值数据,如果数值数据需要更精细的格式化,每一个占位符都可以(可选)包含不同的格式字符,下表显示了核心格式化选项。,使用一些格式化标记(do it),给定的占位符值以冒号为标记,将这些字符作为后缀(例如,0:C、1:d、2:X)。 修改Main()方法,添加下面的语句,从而格式化一个固定值。例如: /使用一些格式化标记 Console.WriteLine(“

12、The value 88888 in various formats:“); Console.WriteLine(“c format: 0:c“, 88888); / 0代表占位符 Console.WriteLine(“d9 format: 0:d9“, 88888); / 补零到9位,前补零 Console.WriteLine(“f3 format: 0:f3“, 88888); / f3 保留小数点后3位 Console.WriteLine(“n format: 0:n“, 88888); / 注意,十六进制数的大小写形式决定了字母是大写还是小写。 Console.WriteLine(“E

13、 format: 0:E“, 88888); Console.WriteLine(“e format: 0:e“, 88888); Console.WriteLine(“X format: 0:X“, 88888); Console.WriteLine(“x format: 0:x“, 88888);,应用程序的输出 (do it),在控制台应用程序外格式化数值数据,.NET字符串格式化字符不局限于在控制台程序中使用!同样的格式化语法可以在调用静态的string.Format()方法时使用。 如果我们需要对任何应用程序类型(桌面GUI程序、 Web程序等)在运行时组合文本数据,这个方法就很有用

14、。在消息对话框中显示: / 使用string.Format()来格式化字符串文本 string userSt = string.Format(“100 in hex is 0:x“,100); / 需要引用System.Windows.Forms.dll才能编译这行代码 System.Windows.Forms.MessageBox.Show(userSt); 注意string.Format()是按照提供的标志进行格式化的。 至此,我们就可以任意使用需要的文本数据了。,2.2 变量、常量和字量,2.2.1 变量的声明 定义或声明变量的方法如下: 类型 var_name; 类型 var_name

15、 = 初值; 其中var_name是变量的名称(标识符)。 注:如果是在类中定义的变量, 声明时可加修饰符(细节见后面章节),2.2.3 变量的种类和赋值,2.2.2 变量的命名 (自学) 变量分为八种类别: 静态、非静态变量、数组元素、局部变量, 值参数、引用参数、输出参数、数组参数。 注意:在C#中,不能定义全局变量。 【例2-3】变量的种类。 class Program /类 int x=1; / x是非静态变量 public static int y=2; / y是静态变量 void f(int s, int val, ref int i, out int j) /数组s,值参数val

16、 int w=2; / w是局部变量 j=x+y+i+w; / j是输出参数 x是非静态变量,y是静态变量,s是数组, val是值参数,i是引用参数,j是输出参数。,2.2.4 常量和字量,常量声明的语法为: 修饰符 const 类型 ConstName; 在声明常量时,要用到const关键字。 下面是一个声明常量的例子: public const double PI = 3.1415926; 字量 字量就是类型的字面值。它与常量本质上相同,但它更加简单:不用声明,把值直接写出来即可。例如,下面语句中出现的123就是整数字量: int i=123;,字符串字量,string s3 = “Hel

17、lo n World!”; /串包含转义序列n, 换行 Console.WriteLine(“0“, s3); 运行结果: Hello World! 逐字字符串字量 逐字字符串字量由字符和后面双引号中的多个字符组成,如果包含转义序列或Unicode字符,都作为一般字符处理。即“转义”失效。例如: string s1 = “Hello World!“; /有字符的串 string s2 = “Hello n World!“; /串包含转义序列n, 但作为二个一般字符处理,即:和n Console.WriteLine(“0 1“, s1, s2); 运行结果: Hello World! Hello

18、 n World!,空字量,空字量只有一个:null。 null本质的含义是没有任何值,即“空”。 null不属于任何类型,但它可隐式地转换为任何可接受空值的类型,如引用类型。 字符串和object都是引用类型, 所以下面语句是正确的: string st = null; / null不等价于无字符的串 “ object obj = null; /表示obj没有任何值,可空类型 int?,但下面的语句不正确: int i = null; 简单类型不是可空类型, 所以int类型的变量不接受null 因此C#提供了“可空类型”这种语法, 只要在任何“不可空”的类型后加?就构成了可空的类型,如“in

19、t?”,所以下面语句是正确的: int? i = null; float? f=null;,2.3 类型,计算机科学家Wirth提出过一个公式: 算法 + 数据结构 = 程序 数据结构在.NET中的形式就是公共类型系统,简称类型(Type)。 一个变量用于连接一个名称(变量名) 和一小块内存。 一个变量有它的值,也就是这小块内存中存储的值。 至于这小块内存的大小, 以及如何解释其中存储的数据,是和变量的类型相关的。,整个C#类型系统,2.3.1 类型的分类,1)值类型和引用类型(分类方法1) 如果按变量存储的是数据还是数据的引用来区分,C#类型(或CTS)可分为值类型和引用类型,见下图。,进一

20、步划分,值类型进一步划分: 简单类型(simple type) 枚举类型(enum type) 结构类型(struct type) 引用类型进一步划分: 类类型(class type) 接口类型(interface type) 数组类型(array type) 委托类型(delegate type) 字符串类型(string type),代码例子,值类型变量直接包括它们的数据, 而引用类型变量存储的是它们的数据引用(即对象引用)。例如: int i = 1; / i是值类型变量,1 直接存储在i中。 object obj = new object(); obj是引用类型变量, obj存储的是对

21、象的引用。,如何理解引用类型,“引用类型到底是什么东西啊?” 我们用比喻法来回答您的问题。 计算机的内存是用于存放数据的,所以内存好比是房屋。 只有二种房屋:一种是“堆”,另一种是“栈”。 但每种房屋会有许多房间,用“房间号”区分它们,“房间号”其实就是内存地址。 double x = 12.3; /x是值类型变量,12.3直接存储在x中。 double y = x; /y是值类型变量,y=x导致12.3存储在y中。 string s1 = new string(w, 3); /s1是引用类型变量,s1存储的是地址0x01-对象的引用。 string s2 = “Hello“; /s2存储的是

22、地址0x02对象“Hello“的引用。 string s3; /s3是引用类型变量,s3什么也没有存储。 string s4 =s2; /s4=s2,导致地址0x02存储在s4中。,内建系统类型和自定义类型(分类方法2),如果按类型是系统定义好的还是用户自定义的来区分,C#类型可分为内建系统类型和自定义类型。有5种C#类型可由用户自定义: 类类型、结构类型、接口类型、枚举类型和委托类型。 其它的都是系统内建好的,用户可直接使用。 内建系统类型 = 简单类型 + 两个引用类型(string和object类),C#内建系统类型,CLS的类型,注:符合CLS的类型可以被任何托管编程语言使用。 如果你

23、的程序中出现了不符合CLS的数据, 那么其他语言可能就不能使用它们。 上表中,有一列(系统类型)专门给出了每种类型的完整名称。C#的所有基本类型都有一个短名称和一个完整名称。完整名称对应于BCL中命名的类型。这个名称在所有语言中都是相同的。 其实从编译器的角度看,两种名称是完全一样的,最终都将生成同样的代码。,自定义的值类型(枚举和结构) 其它“自定义类型” 见第3章之后的内容,1) 枚举 枚举类型是一组命名常数的值类型。 下面的Color枚举类型有三个命名常数: Red、Green和Blue;它们的值分别为0、1和2。 enum Color Red, Green, Blue 虽然数值0、1、

24、2代表三种颜色, 但用命名(Red、Green、Blue)显然要好些, 名称更好记忆与理解。 这正是我们用枚举的原因所在。,下面的程序演示了枚举的用法,class Program enum Color /定义枚举 Red, Green, Blue static void Main(string args) Color myc = Color.Green; /给枚举变量赋值 switch (myc) /判断枚举变量是什么值 case Color.Red: Console.WriteLine(“red value=0“, (int)myc); break; case Color.Green: Co

25、nsole.WriteLine(“green value=0“, (int)myc); break; case Color.Blue: Console.WriteLine(“blue value=0“, (int)myc); break; ,2)结构,像类一样,结构可以包含数据成员和函数成员; 与类不同的是:结构是值类型(不用分配堆), 结构类型的变量直接保存结构的数据, 而不是对象的引用。 结构的一般定义为: 修饰符 struct 结构名 /下面是结构体,用于定义结构的成员 修饰符 类型 字段; /数据成员 修饰符 类型 方法() /方法 ,结构存在的原因,一般情况下,用类即可满足要求; 但

26、如果要求程序的性能高(运行快,节省空间), 对于小的数据结构,用结构可以节省存储空间。 这正是结构存在的原因所在。 下面定义了点结构: struct Point public int x, y; public Point(int x, int y) this.x=x; this.y=y; ,使用结构的代码片段如下:,Point p1 = new Point(10,10); /给结构变量赋值 Point p2 = p1; / 赋值使p2建立了一个p1的副本 p1.x = 100; / 修改p1.x, 但p2.x不会受影响 如果用类定义Point, 则p2 = p1语句使p1和p2变量引用同一个对

27、象, 当修改p1的值(p1.x = 100), p2.x也发生了变化。 这正是值类型与引用类型的差别。,可空类型和不可空类型 (分类方法3),如果按类型是否接受null值来区分,C#类型可分为可空类型(Nullable)和不可空类型。 引用类型是可空类型,而其它的是不可空类型。 但C#提供了一种“可空类型”语法,只要在任何不可空类型后加“?”,就构成了可空的类型,如“int?”、“bool?”,所以下面语句是正确的: int? i = null; / null不等价于0 string st = null; / null不等价于无字符的串 “,泛型和非泛型(分类方法4) 泛型 见第12章,如果按

28、类型是否接受参数来区分,C#类型可分为 泛型(generic)和非泛型。 泛型引入了类型参数,由一个泛型可以派生出许多特定的类型。 “可空类型”语法其实就是泛型 System.Nullable的简写,其中T是参数。 int? 是System.Nullable的简写。 下面的二条语句是等价的: int? i = null; System.Nullable j=null;,2.3.2 简单类型 (系统定义的值类型),简单类型包括数值类型以及bool和char类型。 内容见教材,请自学 2.3.4 结构类型(自定义的值类型) 内容见教材,请自学,2.3.5 字符串 (系统定义的引用类型),【例2-1

29、0】字符串操作:“加”法,取子字符串,替换,插入等。 static void Main() string s1 = “小鸟“; /定义一个字符串变量s1,并赋值 string s2 = s1 + “飞翔“; /字符串“加”法 /结果:s2=“小鸟飞翔“ string s3 = s2.Substring(1, 3); /从字符串的开始位置1,取得长度为3的子串 /结果:s3=“鸟飞翔“ s3 = s2.Replace(“飞翔“, “自由“); /把s2中子串 “飞翔“ 替换为 “自由“ /结果:s3=“小鸟自由“ s3 = s3.Insert(2, “-“); /从位置2,插入字符串“-“ /结

30、果:s3=“小鸟-自由“ bool isEqual = (s1 = s2); /判断二个字符串是否相等 /结果:isEqual = false bool isContain = s2.Contains(“鸟飞翔“); /判断s2中是否包含某字符串 /结果:isContain = true / 静态方法Format,格式化一个字符串, 它与控制台程序格式化是相同的。 s1 = string.Format(“小鸟飞了0公里“, 9); /结果:s1=“小鸟飞了9公里“ ,部分string方法和属性,2.3.6 数组(自定义的引用类型),数组是一种具有相同类型和名称的变量的集合,如一组整数、一组字符

31、等。 1) 一维数组 一维数组类型的语法是在“非数组类型”后放方括号,一般形式为: 非数组类型 int a; /声明了一个数组变量a,初值null,a还没有分配内存空间。 a = new int2; /在堆上分配了有2个整数单元的内存,其地址赋给了变量a a0 = 6; a1 = 4; /对数组的元素进行赋值。,2) 多维数组(矩形数组),一般形式为: 非数组类型n个逗号 n个逗号表示的是数组的维度,即n+1维的数组。例如,int, 表示二维整数数组类型,而下面的语句声明了一个二维数组b: int, b = new int3, 2 1, 2 , 3, 4 , 5, 6 ; 或: int, b

32、= new int3, 2 1, 2, 3, 4 , 5, 6;,2.3.7 object类型 (系统定义的引用类型),所有的结构类型隐式地继承object类型, 这样任何类型的值都能够被处理成对象。 值类型的值可以通过执行装箱(boxing)的操作处理为对象, 也可用取消装箱unboxing, 把object对象还原成值类型的值。 int i=123; object obj=(object)i; /装箱 int j=(int)obj; /取消装箱,2.3.8 变量类型之间的转换,有四种转换方式 : 隐式转换、强制类型转换、ToString函数、Convert类。 1)隐式转换 若两种变量的类

33、型是兼容的或者目标类型的取值范围大于源类型时就可以使用隐式转换。 int i =12; double f= i; /隐式转换成功 i= f;/不成功,因为f取值范围大于i,2) 强制类型转换,强制类型转换告诉编译器: 将一种类型的变量转换为另外一种类型的变量。 隐式转换不能满足所有的编程需要,很多时候还是需要强制类型转换的。但强制转换可能产生的结果不够精确。 强制类型转换语法为: (target-type)变量或表达式; int i = 2; double d = 3.4; int v1 = (int)(i + d); /强制转换: double int数值,3) ToString函数,ToS

34、tring函数用于将变量转化为字符串,各种类型的变量都可以用ToString。下面的代码把int变量转为字符串: int i=250; / i是整型变量 string s=i.ToString(); /结果:变量s的值是字符串 “250”,4) Convert类,ToString无法把一个字符串转为double类型的值。但可使用Convert类进行显示转换。例如: double r = Convert.ToDouble(“3.14”); /Convert 是静态类,ToDouble是它的函数 运行结果:r=3.14, 其值是由字符串“3.14” 显示转换来的。 表2-9 Convert类的常见

35、函数 (见教材),2.4 运算符,运算符是用来定义表达式操作符的。 C#提供了大量的运算符,从功能上可分为: 算术运算符(+, -, *, /, % ) 位运算符 (, &, |, , , ? : ) 赋值运算符( =,+=, -=, *=, /=, %=,位运算符=) 关系运算符(=,!=,= ) 从运算对象上可以分为: 单目运算符、双目运算符和三目运算符。,2.4.1 算术运算符和自增自减运算符,算术运算符是指对数值(如整数、小数等)进行算术运算所用的运算符,包括: 加(+)、减(-)、乘(*)、除(/)、取余(%) 自增和自减运算符包括: +,- 自增运算符其实是加1的简化表示法, 自减

36、运算符是减1的简化表示法。 例如x=x+1,用自增表达式表示为: x+,或:+x,2.4.2 位运算符,位运算符有六种: , &, |, , , 它们在整数范围内对位操作,对二进制格式的值进行处理。 计算机的所有值都表示成1和0的二进制格式,1和0称为位。8位分成一组,称为字节。在一个字节中,每一个位都对应于2的一个乘幂。,按位与 &,int a = 42 即二进制数 00001010 其它位运算 见教材,按位与的真值表,2.4.3 逻辑运算符,逻辑运算符可以将简单的条件组合成复杂的条件。逻辑运算符包括: /y = 5 为true, 但x5 为false, 故a=false 结果:a= fal

37、se 其它逻辑运算见教材。,2.4.4 关系运算符,关系运算符又称为比较运算符,包括: =,!=,= 它们一般用于条件表达式中, 用来判断表达式是否符合条件。 以上运算符的含义见教材的表2-13。 假设x和y是double变量,如x=-6.4, y=3, 则下面都是合法的关系表达式: x y x+3 = y (x3) != (y=5) 三个关系表达式的结果分别为:false, false, true,2.4.5 条件运算符,条件运算符是C#中唯一的一个三元运算符。 一般形式为: ? : 如果满足条件就执行表达式1,否则执行表达式2。 条件运算符常常用于条件赋值,一般形式为: 变量 = ? :

38、int b, x=6, y=4; b = (y 5)? x+1 : 3; 结果:b=7,2.4.6 赋值运算符,赋值运算符分为二种:简单赋值运算符和复合赋值运算符。 简单赋值运算的形式为: 变量 = 表达式 复合赋值运算符: += -= *= /= 等等 见教材的表2-14,2.4.7 特殊运算符,1) 点运算符 点运算符用于指定类型或命名空间的成员。例如: System.Console.WriteLine(“hello“); 命名空间 类 成员(函数) 上例中,点运算符用于访问Console类中的函数WriteLine。,2) 方括号运算符,方括号 用于数组、索引器和特性。 a)数组类型是一

39、种后跟 的类型: int fib = new int100; /创建数组 b)索引器 h“a” = 123; / 用字符串“a”作为索引 c)方括号还用于指定特性: attribute(AllowMultiple=true) public class Attr 3)强制类型转换运算符() 见教材,4) new运算符,当new关键字作为运算符时, 它可用来创建对象和调用构造函数等。 object obj = new object(); /使用new,创建一个object类型的对象obj 注:当new作为修饰符时, 它用来显式隐藏从基类继承的成员。见第四章。 其它特殊运算符见教材。,5) size

40、of 运算符,sizeof(T) 用来计算类型T的字节数。 int b= sizeof(double); 结果 b=8,说明double是8字节的类型。 6) typeof 运算符 typeof(T)用来计算类型T在公共类型系统CTS中对应的类型。例如: System.Type dt= typeof(double); 结果 dt=System.Double System.Type ft= typeof(float); 结果 ft=System.Single,2.5 运算符的优先级和结合性(表2-15),优先级高的先于优先级低的运算符进行运算。 1 运算符并不是按照表达式的书写顺序依次执行的,不

41、同的运算符具备不同的运算顺序,例如: 算术运算符的优先级高于关系运算符。 2 有些同类运算符优先级也有高低之分, 例如在算术运算符中: 乘、除、求余的优先级高于 加、减; 3 逻辑运算符的优先级按从高到低排列为: 非、与、或。,2.5.1 运算符的优先级,我们可以使用圆括号明确运算顺序, 来强制的改变表达式的执行顺序。 有一个简单的方法来记忆运算符优先级顺序: 特殊 一元 算术 移位 关系 按位 逻辑 赋值 表示优先级高于。 运算符中的一元运算符(! 等)是例外, 其他都遵循这个规律。,2.5.2 运算符的结合性,结合性表示: 当优先级相同的时候, 按照运算符的结合方向确定运算的次序。 运算符

42、的结合性分为两种方式: 左结合(从左到右) 右结合(从右向左) 左结合-从左到右,是一般方式。 例如算术运算符: +, -, *, /,结合性,只有三个运算符是从右至左结合的,它们是: 一元运算符、条件运算符、赋值运算符。 其它的都是从左至右结合。 从左至右结合: x = 10/2*5; / 等价于 x= (10/2)*5; 赋值运算符从右至左结合: x=y=3; /等价于 y=3; x=y; 点运算是自左向右结合的, 因此a.b.c的含义是(a.b).c而不是a.(b.c)。 System.Console.Write(“OK“); / 等价于:(System.Console).Write(“OK“);,2.6 编程练习,1 编程要求 编写一个控制台程序,程序可以从键盘读一组正整数, 读到-1结束;程序对输入的一组正整数进行计数,并记录最大和最小数,最后输出它们。 2 编程要点 编程要用循环语句(while)等待用户从键盘输入,用条件语句(if)判断不同情况,做不同的处理,然后用控制台的WriteLine函数输出结果。,感谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1