描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302498407丛书名: 21世纪高等学校计算机类课程创新规划教材·微课版
本书作者结合多年的程序设计、开发及授课经验,精选大量的实例,由浅入深、循序渐进地介绍C#程序设计语言,让读者能够较为系统全面地掌握程序设计的理论和应用。每个相关知识点都配有视频讲解。本书配有实验和辅导教材《C#程序设计实验指导与习题测试(第3版)》,提供了大量的思考与实践练习,让读者从实践中巩固和应用所学的知识。
本书可作为高等学校计算机程序设计教程,同时也可作为广大程序设计开发者、爱好者的自学参考书。
附录C Visual Studio快速入门 537C1 集成开发环境(IDE)界面 537C2 创建解决方案和项目 537C3 设计器/编辑器 539C4 生成和调试工具 540C5 安装和部署工具 541C6 帮助系统 541附录D C#关键字和上下文关键字 542D1 关键字 542D2 上下文关键字 544附录E 格式化字符串 546E1 复合格式设置 546E2 复合格式字符串 546E3 数字格式字符串 547E4 标准日期和时间格式字符串 549附录F XML文档注释 553附录G ASCII码表 557附录H 程序集、应用程序域和反射 558H1 程序集 558 H1.1 程序集概述 558 H1.2 创建程序集 558H2 应用程序域 558 H2.1 应用程序域概述 558 H2.2 创建应用程序域 559H3 反射 559 H3.1 反射概述 559 H3.2 查看类型信息 560 H3.3 动态加载和使用类型 561参考文献 562
用于声明局部常量static void Main() { const float pi = 3.1415927f; const int r = 25; Console.WriteLine(pi * r * r);}表达式语句用于对表达式求值static void Main() { int i; i = 123; //表达式语句 i ; //表达式语句 Console.WriteLine(i); //表达式语句}选择语句if条件语句static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine(“No arguments”); }else{ Console.WriteLine(“One or more arguments”); }}
switch条件语句static void Main(string[] args) { int n = args.Length; switch (n) { case 0: Console.WriteLine(“No arguments”); break; case 1: Console.WriteLine(“One argument”); break; default: Console.WriteLine(“{0} arguments”, n);break; } }}迭代语句while循环语句static void Main(string[] args) { int i = 0; while (i < args.Length) { Console.WriteLine(args[i]); i ; }}
续表语句说明示例迭代语句do循环语句static void Main() { string s; do { s = Console.ReadLine(); if (s != null) Console.WriteLine(s); } while (s != null);}
for循环语句static void Main(string[] args) { for (int i =0; i Console.WriteLine(args[i]); }}
foreach循环语句static void Main(string[] args) { foreach (string s in args) {Console. WriteLine(s);}}跳转语句break跳转语句static void Main() { while (true) { string s = Console.ReadLine(); if (s == null) break; Console.WriteLine(s); }}
continue跳转语句static void Main(string[] args) { for (int i =0; i if (args[i].StartsWith(“/”)) continue; Console.WriteLine(args[i]); }}
goto跳转语句static void Main(string[] args) { int i = 0; goto check; loop: Console.WriteLine(args[i ]); check: if (i < args.Length) goto loop;}
return跳转语句static int Add(int a, int b) {return a b;}static void Main() { Console.WriteLine(Add(1, 2));}
yield跳转语句static IEnumerable Range(int from, int to) { for (int i=from; i if (args.Length != 2) { throw new Exception(“Two numbers required”); } double x = double.Parse(args[0]); double y = double.Parse(args[1]); Console.WriteLine(Divide(x, y)); } catch (Exception e) { Console.WriteLine(e.Message); } finally { Console.WriteLine(“Good bye!”); }}checked和unchecked语句用于算术运算溢出检查static void Main() { int i = int.MaxValue; checked { Console.WriteLine(i 1); //异常 } unchecked { Console.WriteLine(i 1); //溢出 }}lock语句用于同步锁class Account{ decimal balance; public void Withdraw(decimal amount) { lock (this) { if (amount > balance) { throw new Exception(“资金不足!”); } balance -= amount; } }}using语句用于资源上下文static void Main() { using (TextWriter w = File.CreateText (“test.txt”)) { w.WriteLine(“Line one”);w.WriteLine (“Line two”); }}3.1.3 C#语句的使用 C#语句涉及许多程序构造要素,本书将在其他章节分别阐述。其中涉及程序控制流程的语句将在第4章中展开阐述。 【例3.1】 C#语句示例(Statements.cs):声明语句、控制语句、赋值语句、循环语句、调用静态方法以及调用对象方法等。 using System; namespace CSharpBook.Chapter03 { class StatementTest { void PrintArea(int r) { //代码块:printArea的方法体 const double PI = 3.14; //声明语句:声明常量 double a; //声明语句:声明变量 if (r > 0) //控制语句 { a = PI * r * r; //赋值语句,计算圆面积 Console.WriteLine(“半径={0}, 面积={1}”, r, a); } else { //调用静态方法 Console.WriteLine(“半径={0},半径<=0,错误!”, r); } } static void Main() { //代码块:Main的方法体 StatementTest obj; //声明语句:声明对象 obj = new StatementTest(); //赋值语句/创建对象 for (int i = -2; i < 3; i ) //循环语句 { obj.PrintArea(i); //调用对象方法 } Console.ReadKey(); } } } 运行结果: 半径=-2,半径<=0,错误! 半径=-1,半径<=0,错误! 半径=0,半径<=0,错误! 半径=1, 面积=3.14 半径=2, 面积=12.563.2 运 算 符 C#运算符(operator)是术语或符号,用于在表达式中对一个或多个操作数进行计算并返回结果值。接收一个操作数的运算符被称作一元运算符,如增量运算符( )或new。接收两个操作数的运算符被称作二元运算符,如算术运算符 、?、*、/。接收三个操作数的运算符被称作三元运算符,条件运算符“?:”是C#中唯一的三元运算符。 当表达式包含多个运算符时,运算符的优先级控制各运算符的计算顺序。例如,表达式x y*z按x (y*z)计算,因为“*”运算符的优先级高于“ ”运算符。 C#语言定义了许多运算符,通过运算符重载(overload)(参见7.6节)可以为用户自定义的类型定义新的运算符。3.2.1 算术运算符 C#中以优先级为顺序的算术运算符如表3-2所示。其中: (1)“ ”运算符既可作为一元运算符也可作为二元运算符。一元“ ”运算符是为所有数值类型预定义的。数值类型的一元“ ”运算的结果就是操作数本身的值。二元“ ”运算符是为数值类型和字符串类型预定义的。对于数值类型,二元“ ”运算符计算两个操作数之和;对于字符串类型,二元“ ”运算符拼接两个字符串。 (2)“?”运算符既可作为一元运算符也可作为二元运算符。一元“?”运算符是为所有数值类型预定义的。数值类型的一元“?”运算的结果是操作数的反数。二元“?”运算符是为所有数值类型和枚举类型预定义的,其功能是从第一个操作数中减去第二个操作数。 (3)除法运算符(/)是为所有数值类型预定义的。两个整数相除的结果始终为一个整数。若要获取作为有理数或分数的商,应将被除数或除数设置为float类型或double类型。可以通过在数字后添加一个小数点来隐式执行此操作。 (4)假设表中num为整型变量,取值为8。表3-2 算术运算符运算符含义说明优先级实例结果 增量操作数加11 num,num 9??减量操作数减11??num,num??7 一元 操作数的值2 num8?一元?操作数的反数2?num?8*乘法操作数的积3num*num*2128/除法第二个操作数除第一个操作数310 / num10.0 / num11.25%模数第二个操作数除第一个操作数后的余数310 % numnum % 2.221.4 加法两个操作数之和410 num18?减法从第一个操作数中减去第二个操作数410 ? num2 注意: (1)算术运算符两边的操作数应是数值型。若是字符型,则自动转换成字符所对应的ASCII码值后再进行运算。例如: 10 ‘a’; //结果是107,字符’a’的ASCII码值为97,10 97=107 100-‘0’; //结果是52,字符’0’的ASCII码值为48,100-48=52 (2)增量运算符( )可以出现在操作数之前( variable)或之后(variable )。 ① 第一种形式是前缀增量操作。该运算的结果是操作数加1之后的值。 ② 第二种形式是后缀增量操作。该运算的结果是操作数加1之前的值。 例如: b=100; a= b; //相当于“b=b 1; a=b”。结果a=101,b=101 b=100; a=b ; //相当于“a=b; b=b 1”。结果a=100,b=101 (3)减量运算符可以出现在操作数之前(??variable)或之后(variable??)。 ① 第一种形式是前缀减量操作。该运算的结果是操作数减1之后的值。 ② 第二种形式是后缀减量操作。该运算的结果是操作数减1之前的值。 例如: b=100; a=–b; //相当于“b=b-1; a=b”。结果a=99,b=99 b=100; a=b–; //相当于“a=b; b=b-1”。结果a=100,b=99 (4)整数的算术结果可能导致溢出,但不会产生异常。使用checked关键字可以实现溢出检查。例如: int a = int.MinValue; a–; //变量a的结果是int.MaxValue int b = int.MaxValue; b ; //变量b的结果是int.MinValue int c = checked(int.MaxValue 1); //在checked模式下,运算在编译时溢出 【例3.2】 算术运算符示例(Arithmetic.cs)。 using System; namespace CSharpBook.Chapter03 { class ArithmeticTest { static void Main() { // (增量运算符),–(减量运算符) double x,y; x = 1.5; y = x; Console.WriteLine(“x={0}, y={1}”,x, y); x = 1.5; y = x ; Console.WriteLine(“x={0}, y={1}”, x, y); x = 1.5; y = –x; Console.WriteLine(“x={0}, y={1}”, x, y); x = 1.5; y = x–; Console.WriteLine(“x={0}, y={1}”, x, y); x=5.8; int i = 5; Console.WriteLine(“i={0}, i={1}”, i, i); //一元 Console.WriteLine(“i 5={0}, i .5={1}”, i 5, i .5); //二元 Console.WriteLine(“x={0}, x “5”= {1}”, x, x “5”); //字符串拼接(double自动转换为string) Console.WriteLine(“‘5’ ‘5’= {0}, ‘A’ ‘A’= {1}”, ‘5’ ‘5’, ‘A’ ‘A’); //字符转换为ASCII码值相加 i= 5; Console.WriteLine(“i={0}, -i={1}, i-1={2}, i-.5={3}”, i, -i, i – 1, i – .5); //-(一元-&二元减法) Console.WriteLine(“i*8={0}, -i*.8={1}”, i * 8, -i * .8); //*(乘法) Console.WriteLine(“i/2={0}, -i/2.1={1}”, i / 2, -i / 2.1); //(除法) Console.WriteLine(“i%2={0}”, i % 2); //%(取模) Console.ReadKey(); } } } 运行结果: x=2.5, y=2.5 x=2.5, y=1.5 x=0.5, y=0.5 x=0.5, y=1.5 i=5, i=5 i 5=10, i .5=5.5 x=5.8, x “5”= 5.85 ‘5’ ‘5’= 106, ‘A’ ‘A’= 130 i=5, -i=-5, i-1=4, i-.5=4.5 i*8=40, -i*.8=-4 i/2=2, -i/2.1=-2.38095238095238 i%2=1 3.2.2 关系和类型测试运算符 关系和类型测试运算符是二元运算符。关系运算符用于将两个操作数的大小进行比较。若关系成立,则比较的结果为True,否则为False。关系运算符的操作数可以是数值型、字符型和枚举类型。表3-3列出了C#中的关系和类型测试运算符。假设有如下定义:int[] myArray = new int[]{1, 2}。表3-3 关系和类型测试运算符运算符含义实例结果==相等’a’==’A’False!=不等’a’!=’A’True>大于’a’=大于或等于123 >= 23True //定义mark为double浮点型变量 string str1; //定义str1为字符串类型变量 bool judge; //定义judge为bool类型变量 mark = 98.2; //将98.2值赋给mark str1 = “C#.NET程序设计”; //为字符串类型变量赋值 judge = ‘A’>’a’; //将表达式的计算结果False赋给bool类型变量judge 2.复合赋值语句 表3-5列出了C#中的复合赋值运算符。复合赋值运算符不仅可以简化程序代码,使程序更精炼,而且还可以提高程序编译的效率。例如,x =y虽然等效于x=x y,但是,x =y中x只计算一次。表3-5 复合赋值运算符运算符含义举例等效于 =加法赋值sum = itemsum = sum item?=减法赋值count ?=1count = count ? 1*=乘法赋值x *= y 5x = x * (y 5)/=除法赋值x /= y?zx = x / (y?z)%=取模赋值x %= 2x = x % 2<<=左移赋值x << = yx = x << y>>=右移赋值x >> = yx = x >> y&=与赋值x &= 5>3x = x & (5>3)|=或赋值x |= truex = x | true^=异或赋值x ^= yx = x ^ y 【例3.4】 赋值运算符示例(Assignment.cs)。 using System; namespace CSharpBook.Chapter03 { class AssignmentTest { static void Main() { int a = 5; a = 6; Console.Write(“a=” a); //加法赋值运算符 string s = “Hello”; s = ” world.”; Console.Write(” s=” s); //字符串拼接 a = 5; a -= 6; Console.WriteLine(” a=” a); //减法赋值 a = 5; int i = 10; a *= i 6; Console.Write(“a=” a); //乘法赋值 a = 5; a /= i – 6; Console.Write(” a=” a); //除法赋值 double d = 5; d /= i – 6; Console.Write(” d=” d); //除法赋值 a = 5; a %= 3; Console.WriteLine(” a=” a); //取模赋值 a = 0x0c; a &= 0x06; Console.Write(“0x{0:x8}”, a); //与赋值 bool b = true; b &= false; Console.WriteLine(” b={0}”, b); //与赋值 a = 0x0c; a |= 0x06; Console.Write(“0x{0:x8}”, a); //或赋值 b = true; b |= false; Console.WriteLine(” b={0}”, b); //或赋值 a = 0x0c; a ^= 0x06; Console.Write(“0x{0:x8}”, a); //异或赋值 b = true; b ^= false; Console.WriteLine(” b={0}”, b); //异或赋值 a = 1000; a <<= 4; Console.Write(“a=” a); //左移赋值 a = 1000; a >>= 4; Console.WriteLine(” a=” a); //右移赋值 Console.ReadKey(); } } } 运行结果: a=11 s=Hello world. a=-1 a=80 a=1 d=1.25 a=2 0x00000004 b=False 0x0000000e b=True 0x0000000a b=True a=16000 a=623.2.5 字符串运算符 C#提供的字符串运算符只有一个“ ”,用于串联(拼接)两个字符串。当其中的一个操作数是字符串类型或两个操作数都是字符串类型时,二元“ ”运算符执行字符串串联。在字符串串联运算中,如果一个操作数为null,则用空字符串来替换此操作数;否则,任何非字符串参数都通过调用从object类型继承的虚ToString方法,转换为其字符串表示形式。如果ToString返回null,则替换成空字符串。例如: “计算机” “程序设计” //结果为”计算机程序设计” “面向对象” null “高级编程” //结果为”面向对象高级编程” “12345” 12345 //结果为”1234512345″ “12345” 1.2345E 10F //结果为”123451.2345E 10″ “abc” 2.900m //结果为”abc2.900″3.2.6 位运算符 位运算符用于按二进制位进行逻辑运算。表3-6列出了C#中的位运算符。 表3-6 位运算符运算符含义优先级实例结果~按位求补1~0x000000f80xffffff07<>右移20xffffffff >> 10x7fffffff&按位逻辑与30xf8 & 0x3f0x38^按位逻辑异或40xf8 ^ 0x3f0xc7|按位逻辑或50xf8 | 0x3f0xff 注意: (1)按位求补(~)运算符是为int、uint、long和ulong类型预定义的,对操作数执行按位求补运算,其效果相当于反转每一位。 (2)左移运算符(<>)将第一个操作数向右移动第二个操作数所指定的位数。 ① 如果第一个操作数为int或uint(32位数),则移位数由第二个操作数的低5位给出(第二个操作数&0x1f)。 ② 如果第一个操作数为long或ulong(64位数),则移位数由第二个操作数的低6位给出(第二个操作数&0x3f)。 ③ 如果第一个操作数为int或long,则右移位是算术移位(高序空位设置为符号位)。如果第一个操作数为uint或ulong类型,则右移位是逻辑移位(高位填充0)。 【例3.5】 位运算符<>示例(Bitwise.cs)。 using System; namespace CSharpBook.Chapter03 { class BitwiseTest { static void Main() { //左移运算符(<>) uint ui = 0xffffffff; ulong ulg = 0xffffffff; Console.WriteLine(“0x{0:x}”, ui >> 33); Console.WriteLine(“0x{0:x}”, ulg >> 33); Console.ReadKey(); } } } 运行结果: 0x2 0x200000000 0x7fffffff 0x03.2.7 条件运算符 使用条件运算符,可以更简洁地表达某些if…else结构的计算。条件运算符是C#中唯一的三元运算符,由符号“?”和“:”组成,其一般形式为: 逻辑表达式? 表达式1: 表达式2; 首先计算“逻辑表达式”的值,如果为True,则运算结果为“表达式1”的值,否则运算结果为“表达式2”的值。例如,计算a和b两个数中较大的数,并将其赋给变量maxnum中,语句为: maxnum = (a > b)? a : b; 等价于: if (a>b) maxnum = a; else maxnum = b;3.2.8 null相关运算符 C#在涉及对象的操作中,如果对象为空,则会产生异常。健壮的程序需要进行空判断。C#提供了与null相关的运算符,可以简化代码。 1.null合并运算符“??”(null coalescing operator) “??”用于返回在非空的操作上,如果操作数值为空,则返回缺省值。其语法为: 表达式 ?? 缺省值 例如: string s1 = null; string s2 = s1 ?? “nothing”; //s2的结果为”nothing” 2.null条件成员访问运算符“?.”和“?[]”(C# 6.0) 访问对象的成员时,如果对象为空,则会产生异常。使用“?.”代替“.”运算符,可以简化空判断操作:如果操作数为空,则返回空;否则执行相应操作。其语法为: 对象?.成员 例如: string s1 = null; string s2 = s1?. ToUpper(); //结果为null,不会产生异常 int? length = customers?.Length; //如果customers为null则返回null,否则返回其长度 Customer first = customers?[0]; //如果customers为null则返回null,否则返回其第一个元素 上例中“string s2 = s1?. ToUpper();”相当于语句: string s2 = (s1 == null ? null : s1. ToUpper ());3.2.9 其他运算符 sizeof用于获取值类型的字节大小,仅适用于值类型,而不适用于引用类型。sizeof运算符只能在不安全代码块中使用。不安全代码参见5.2节。 typeof用于获取类型的System.Type对象,如System.Type type = typeof(int)。若要获取表达式的运行时类型,可以使用.NET Framework方法GetType()。例如: int i = 0; System.Type type = i.GetType(); //结果为[System.Int32] nameof用于返回标识符(类型、成员、变量等)的名称。例如: int count = 123; string name = nameof(count); //结果为”count” string name1 = nameof (String.Format); //结果为”Format” string name2 = nameof(String) “.” nameof(String.Format); //结果为”String.Format” 【例3.6】 sizeof运算符示例(sizeof.cs)。 //compile:csc /unsafe sizeof.cs -> sizeof.exe using System; namespace CSharpBook.Chapter03 { class MainClass { unsafe static void Main() { Console.WriteLine(“The size of short is {0}”, sizeof(short)); Console.WriteLine(“The size of int is {0}”, sizeof(int)); Console.WriteLine(“The size of long is {0}”, sizeof(long)); } } } 运行结果: The size of short is 2 The size of int is 4 The size of long is 8 【例3.7】 typeof运算符示例(typeof.cs)。 using System; namespace CSharpBook.Chapter03 { public class SampleClass { static void Main() { Type t1 = typeof(bool); Console.WriteLine(“typeof(bool) is {0}”, t1); int radius = 5; Type t2 = radius.GetType(); Console.WriteLine(“radius.GetType() is {0}”, t2); Console.WriteLine(“Area = {0}”, radius * radius * Math.PI); Console.WriteLine(“The type of Area is {0}”, (radius*radius*Math.PI).GetType()); Console.ReadKey(); } } } 运行结果: typeof(bool) is System.Boolean radius.GetType() is System.Int32 Area = 78.5398163397448 The type of Area is System.Double3.2.10 运算符优先级 表达式中的运算符按照运算符优先级(precedence)的特定顺序和结合性规则计算。表3-7所示为按C#语言定义运算符优先级从高到低的顺序列出各运算符类别,同一类别中的运算符优先级相同。表3-7 运算符优先级顺序和结合性规则类别运算符说明结合性基本x.m成员访问?
?.和?[]null条件成员访问
f(x)方法和委托调用
a[x]数组和索引器访问
?>指针成员访问
x 后增量
x??后减量
续表类别运算符说明结合性基本new类型实例化?
typeof(T)获得T的System.Type对象
nameof(x)获取标识符的名称
checked在checked上下文中计算表达式
unchecked在unchecked上下文中计算表达式
default(T)返回类型T的默认值
sizeof(x)返回类型操作数的大小(以字节为单位)
一元 恒等?
?求相反数
!逻辑求反
~按位求反
x前增量
??x前减量
(T)x显式将x转换为类型T
&取操作数的地址
*取消引用运算符,用于读取和写入指针
await等待任务
乘除*乘法?
/除法
%求余
加减 加法、字符串串联、委托组合?
?减法、委托移除
移位<>>右移
关系和类型检测>大于
<=小于或等于
>=大于或等于
x is T如果x属于T类型,则返回True,否则返回False
x as T返回转换为类型T的x,如果x不是T则返回null
相等==等于?
!=不等于
逻辑与x & y整型按位AND,布尔逻辑AND?逻辑异或x ^ y整型按位XOR,布尔逻辑XOR?逻辑或x | y整型按位OR,布尔逻辑OR?条件与x && y仅当x为true才对y求值?条件或x || y仅当x为false才对y求值?条件运算x ? y : z如果x为true,则对y求值,否则对z求值?赋值和匿名函数=赋值?
=、?=、*=、/=、%=、&=、|=、^=、<<=、>>=复合赋值
=>lambda表达式
当表达式中出现两个具有相同优先级的运算符时,则根据结合性进行计算。左结合运算符按从左到右(表中用符号“?”示意)的顺序计算。例如,x*y/z计算为(x*y)/z。右结合运算符按从右到左(表中用符号“?”示意)的顺序计算。注意,C#语言中赋值运算符和三元运算符(?:)是右结合运算符,如x=y=z计算为x=(y=z)。其他所有二元运算符都是左结合运算符。 优先级和结合性都可以用括号控制。例如,2 3*2的计算结果为2 (3*2)=8;而(2 3)*2的计算结果为10。再如: bool b = 16 2 * 5 >= 7 * 8 / 2 || “XYZ” != “xyz” && !(10 – 6 > 18 / 2); 相当于: bool b = ((16 (2 * 5)) >= ((7 * 8) / 2)) || ((“XYZ” != “xyz”) && (!((10 – 6) > (18 / 2)))); 结果为True。3.3 表 达 式 表达式(expression)是可以计算的代码片段,其计算结果一般为单个值、对象以及类型成员。表达式由操作数(变量、常量、函数)、运算符和括号按一定规则组成。表达式通过运算后产生运算结果,运算结果的类型由操作数和运算符共同决定。 例如,表达式a 3由两个操作数(变量a和常量3)和一个运算符(运算符 )组成。3.3.1 表达式的组成 表达式由运算符(operator)和操作数(operand)构成。表达式的运算符指示对操作数适用什么样的运算。运算符的示例包括 、?、*和/等;操作数的示例包括文本(没有名称的常数值)、字段、局部变量、方法参数和类型成员等,也可以包含子表达式,因此表达式既可以非常简单,也可以非常复杂。当表达式包含多个运算符时,运算符的优先级控制各运算符的计算顺序(参见3.2.9节)。3.3.2 表达式的书写规则 表达式的书写规则如下:* 乘号不能省略,如a乘以b应写为a*b;* 括号必须成对出现,而且只能使用小括号。小括号可以嵌套使用;* 表达式从左到右在同一个基准上书写,无高低,区分大小写。 例如,数学表达式写成C#表达式为Math.sin(a*x b)/2。3.3.3 表达式的示例 【例3.8】 C#表达式示例(ExpressionTest.cs)。 using System; namespace CSharpBook.Chapter03 { class ExpressionTest { static void Main(string[] args) { int a = 1,b = 2,c = 3; a = b c; Console.WriteLine(” a = {0}, b = {1}, c = {2}”, a, b, c); Console.WriteLine(” c >= b && b >= a 结果为:{0}”, c >= b && b >= a); Console.WriteLine(” a < b ? a : b 结果为:{0}”, a < b ? a : b ); Console.WriteLine(” a = {0}, b = {1}, c = {2}”, a, b, c); Console.WriteLine(” c = a > b ? a : b 结果为:{0}”, c = a > b ? a : b ); Console.WriteLine(” a = {0}, b = {1}, c = {2}”, a, b, c); a = b = c = 2; Console.WriteLine(” a = {0}, b = {1}, c = {2}”, a, b, c); a = 3; b = 8; c = 4; Console.WriteLine(” a = {0}, b = {1}, c = {2}”, a, b, c); Console.WriteLine(” a < b ? a : b < c ? b : c 结果为:{0}”, a < b ? a : b < c ? b : c); Console.WriteLine(” (a < b ? a : b) < c ? b : c 结果为:{0}”, (a < b ? a : b) < c ? b : c); Console.WriteLine(” (b2-4ac)的平方根为:{0}”, Math.Sqrt(Math.Pow (b,2)-4*a*c)); bool m = false, n = true, p = true; Console.WriteLine(” m = {0}, n = {1}, p = {2}”, m, n, p); Console.WriteLine(” m | n ^ p = {0}”, m | n ^ p); Console.WriteLine(” m | n ^ p = {0}”, n | m ^ p); Console.ReadLine(); } } } 运行结果: a = 6, b = 3, c = 3 c >= b && b >= a 结果为:False a < b ? a : b 结果为:3 a = 6, b = 4, c = 3 c = a > b ? a : b 结果为:9 a = 7, b = 4, c = 9 a = 2, b = 2, c = 2 a = 3, b = 8, c = 4 a < b ? a : b < c ? b : c 结果为:3 (a < b ? a : b) < c ? b : c 结果为:8 (b2-4ac)的平方根为:4 m = False, n = True, p = True m | n ^ p = False m | n ^ p = True
评论
还没有评论。