目录
1.C#的基本语句
1.1块语句
1.2空语句
1.3声明语句
1.4表达式语句
2.选择语句
2.1if语句
2.2if框架
2.3if else if框架
2.4嵌套的if语句
2.5switch语句
3.循环语句
3.1 for循环语句
3.2 foreach循环语句
3.3 while循环语句
3.4 do-while语句
4.跳转语句
4.1 continue语句
4.2 break语句
4.3 return语句
4.4 goto语句
4.5 异常处理语句
块语句把一系列语句包装成一个语句,块语句的一般格式如下:
{
一个或者多个语句;
}
空语句是一种最简单的语句,它不实现任何功能,C#中空语句的形式如下:
;
声明语句主要完成对一个常量或者变量的声明,声明一个变量的语法结构如下:
类型 [变量 [ = 表达式 ]];
表达式语句由表达式加上分号“;”组成。其一般形式为:
表达式;
if语句根据布尔表达式的值(true或者false)选择要执行的语句序列,使用时要注意else应和最近的if语句匹配。三种形式:
if
if…else
if…else if…else
形式:if (条件表达式) 语句;
如果条件为真,则执行语句。在语法上这里的语句是指单个语句,若想执行一组语句,可加将这一组语句用“{”和“}”括起来构成一个块语句,当然在语法上块语句就是一条语句,下面涉及到语句都是这个概念。例如:
if ( x<0 ) x = -x ; // 取x的绝对值
if (a+b>c && b+c>a && a+c>b) // 判断数据合法性
{
p = (a+b+c)/2 ;
// 求三角形面积
s = Math.Sqrt(p*(p-a)*(p-b)*(p-c)); }
形式:
if (条件表达式)
语句1;
else
语句2;
如果条件表达式为真,执行语句1;否则执行语句2。例如:
if (a+b>c && b+c>a && a+c>b) // 判断数据合法性
{
p = (a+b+c) / 2 ;
s = Math.Sqrt(p*(p-a)*(p-b)*(p-c)); // 求三角形面积
}
else
Console.WriteLine("三角形的三条边数据有错!" ) ;
形式:
if (条件表达式1)
语句1 ;
else if (条件表达式2)
语句2 ;
else if (条件表达式3)
语句3 ;
……
[ else
语句n ;]
这种语句执行时,从上往下地计算相应的条件表达式,如果结果为真则执行相应语句,跳过if_else if框架的剩余部分,直接执行if_else if框架的下一条语句;如果结果为假,则继续往下计算相应的条件表达式,直到所有的条件表达式都不成立,则执行这个语句的最后部分else所对应的语句,或者如果没有else语句就什么也不做。
例:根据分数输出等级。成绩大于等于90分为“优秀”;大于等于80,小于90为“良好”;大于等于60,小于80为“及格”;小于60为“不及格”。
if (studentGrade>=90)
Console.WriteLine ("优秀");
else if (studentGrade>=80)
Console.WriteLine ("良好");
else if (studentGrade>=60)
Console.WriteLine ("及格");
else
Console.WriteLine ("不及格");
在if语句框架中,无论条件表达式为真或为假,将要执行的语句都有可能又是一个if语句,这种if语句又包含if语句的结构就称之为嵌套的if语句。为了避免二义性,C#规定else语句与和它处于同一模块最近的if相匹配。例如:
假设有一函数
下面是用嵌套的if语句写的程序片断。
y=0;
if (x>=0)
if (x>0)
y=1 ;
else
y=-1;
这个else是与最近的if匹配,那么else的含义就是x=0的情况,所以这个程序逻辑上是错的。如果按这个结构写,应修正为:
y=0;
if (x>=0)
{
if (x>0)
y=1;
}
else
y=-1;
switch语句是一个多分支结构的语句,它所实现功能与if_else if结构很相似,但在大多数情况下,switch语句表达方式更直观、简单、有效。语法格式:
switch (表达式)
{
case 常量1:
语句序列1; // 由零个或多个语句组成
break;
case 常量2:
语句序列2;
break;
......
default: // default 是任选项,可以不出现
语句序列n;
break;
}
①常量表达式
switch条件表达式的值和每个case后的常量表达式可以是string、int、char、enum或其它值类型。
②语句序列
每个case后的语句序列可以用大括号括起来,也可以不用,但是每个case块的最后一句一定要是break语句,或者是goto语句。
③switch语句的执行顺序
a) 如果switch语句的条件表达式的值和某一个case标记后指定的值相等,则转到该case标记后的语句序列执行;
b)若switch语句的条件表达式的值和任何一个case标记后指定的值都不相等,则跳到default标记后的语句序列执行;
c)若switch语句下面没有default标记,则跳到switch语句的结尾。
注意:
a) 要求每个语句序列的最后一条语句必须是break语句,但是有一个情况例外:如果某个case块为空,则会从这个case块直接跳到下一个case块上。
b) 如果case后有语句,则此case的顺序怎么放都无所谓,甚至可以将default子句放到最上面。因此,在一个switch中,不能有相同的两个case标记。
using System;
namespace SwitchExample
{
public class Program
{
public static void Main()
{
Console.Write("请输入成绩:");
//从键盘接收一行字符
string str = Console.ReadLine();
//转换为整型,注意此语句可能会产生异常,一般需要异常处理
int i = Int32.Parse(str.Trim());
//或者int.Parse(…)或者Convert.ToInt32 (…)
if (i > 100 || i < 0)
{
Console.WriteLine("成绩不在0-100范围内");
}
else
{
switch (i / 10) //整除
{
case 10:
Console.Write("满分,");
goto case 9;
case 9:
Console.WriteLine("优秀");
break;
case 8:
case 7:
Console.WriteLine("良好");
break;
case 6:
Console.WriteLine("及格");
break;
default:
Console.WriteLine("不及格");
break;
}
}
Console.ReadLine();
}}}
C#的for循环是循环语句中最具特色的,它功能较强、灵活多变、使用广泛。语法形式:
for ( 表达式1; 表达式2; 表达式3 )
循环体语句;
一般情况下,表达式1是设置循环控制变量的初值; 表达式2是bool类型的表达式,作为循环控制条件;表达式3是设置循环控制变量的增值(正负亦可)。for语句执行流程如下图所示。
例如:用for语句求
static void Main(string[] args)
{
int Sum, i;
Sum = 0;
for (i = 1; i <= 100; i++) // i每次加1
Sum += i;
Console.WriteLine("Sum is " + Sum);
Sum = 0;
for (i = 100; i > 0; i--) // i也可以每次减1
Sum += i;
Console.WriteLine("Sum is " + Sum);
Console.ReadLine();
}
for循环的一些变化特点:
(1)for循环语句,表达式1和表达式3可引入逗号运算符“,”,这样可以对若干个变量赋初值或增值。
【例】用for语句求 1到100的累加和。
static void Main(string[] args)
{
int Sum, i;
for (Sum = 0, i = 1; i <= 100; i++)
Sum += i;
Console.WriteLine("Sum is " + Sum);
for (Sum = 0, i = 1; i <= 100; Sum += i, i++)
; // 循环体是一空语句
Console.WriteLine("Sum is " + Sum);
Console.ReadLine();
}
(2)for循环的三个表达式可以任意缺省,甚至全部缺省,如果表达式2缺省就约定它的值是true。但不管哪个表达式缺省,其相应的分号“;”不能缺省。
(3)可在for循环内部声明循环控制变量。
如果循环控制变量仅仅只在这个循环中用到,那么为了更有效地使用变量,也可在for循环的初始化部分(表达式1)声明该变量,当然这个变量的作用域就在这个循环内。
①语句的格式为:
foreach(类型 标识符 in 表达式)
语句块;
string[] A = { "时有四季", "月有亏盈", "日有远近","天有长短" };
foreach(string temp in A )
{
Console.WriteLine(temp);
}
与for循环一样,while也是一个预测试的循环。如果其测试条件的值等于false,while循环就不会执行,其语法是类似的,但是while循环只有一个表达式:
while(循环测试条件)
语句块;
【例】 用while语句求 1-100的和:
static void Main(string[] args)
{
int Sum, i;
Sum = 0; i = 1;
while (i <= 100)
{
Sum += i;
i++;
}
Console.WriteLine("Sum is " + Sum);
Console.ReadLine();
}
do-while语句与while 语句不同的是它将内嵌语句执行至少一次或若干次:
do
{
语句块;
} while(循环测试条件)
【例】用do_while语句求 1-100的和。
static void Main(string[] args)
{
int Sum , i ;
Sum=0; i=1;
do
{
Sum += i;
i++;
}
while (i <= 100);
Console.WriteLine ("Sum is " + Sum);
Console.ReadLine();
}
continue语句语法形式:
continue;
continue语句只能用于循环语句之中,它的作用是结束本轮循环,不再执行余下的循环体语句,对while和do_while结构的循环,在continue执行之后就立刻测试循环条件,以决定循环是否继续下去;对for结构循环,在continue执行之后,先求表达式3(即循环增量部分),然后再测试循环条件。
【例】把1~100之间能被3整除的数输出。
static void Main(string[] args)
{
for (int n = 1; n <= 100; n++)
{
// 如果n不能被3整除,则直接进入下一轮循环
if (n % 3 != 0)
continue;
// 只有能被3整除的数,才会执行到此
Console.WriteLine(n);
}
Console.ReadLine();
}
break语句语法形式:
break;
break语句只能用于循环语句或switch语句中,如果在switch语句中执行到break语句,则立刻从switch语句中跳出,转到switch语句的下一条语句;如果在循环语句执行到break语句,则会导致本层循环立刻结束。
【例】求1~100之间所有素数。
注解:素数:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,即该数除了1和它本身以外不再有其它的因数。
static void Main(string[] args)
{
int m, k, n = 0;
for (m = 2; m < 100; m++)
{
for (k = 2; k < m; k++)
{
if (m % k == 0)
break;
}
if (k >= m)
{
Console.Write("{0,-4}",m);
if (++n % 10 == 0)
Console.WriteLine("\n");
}
}
}
①return语句语法形式:
return;
或
return 表达式;
return语句出现在一个方法内,在方法中执行到return语句时,程序流程转到调用这个方法处。
【例】求1~100之间所有素数。
public static bool prime(int m)
{
for (int i = 2; i < m; i++)
{
if (m % i == 0)
return false;
}
return true;
}
static void Main(string[] args)
{
int m,n = 1;
Console.Write("{0,-4}", 2);
for (m = 3; m < 100; m+=2)
{
if (prime(m))
{
Console.Write("{0,-4}",m);
if (++n % 10 == 0)
{
Console.WriteLine("\n");
}
}
}
}
①语法形式:
goto 标号;
其中标号就是定位在某一语句之前的一个标识符,这称为标号语句,它的格式是:
标号:语句;
它给出goto语句转向的目标。值得注意的是,goto 语句不能使控制转移到另一个语句块内部,更不能转到另一个函数内部。
另外goto语句如果用在switch语句中,它的格式是:
goto case 常量;
goto default ;
②goto 语句
goto语句可以直接跳转到程序中标签语句中,例如:
goto lable1;
Console.WriteLine("This won’t be executed");
lable1:
Console.WriteLine("Continuing execution from here");
异常可以以两种不同的方式引发:
throw 语句无条件即时的抛出异常;
C#语句和表达式执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常。例如整数除法,操作分母为零时将抛出一个System.DivideByZeroException异常。
①throw语句
throw语句格式:
throw [表达式];
抛出表达式的值。
注意表达式类型必须是System.Exception或从System.Exception派生的类的类型。
throw也可以不带表达式,不带表达式的throw语句只能用在catch块中,在这种情况下,它重新抛出当前正在由catch块处理的异常。
static void Main()
{
string s = null;
if (s == null)
{
throw new ArgumentNullException();
}
// not executed
Console.Write("The string s is null");
}
②try语句
在C#中的try语句提供了一种机制来捕捉块执行过程中发生的异常,以下是它的三种可能的形式:
try -catch
try –finally
try -catch-finally
①try-catch语句
try
{
语句序列
}
catch(异常类型 标识符)
{
异常处理
}
在程序运行正常的时候,执行try块内的程序。如果try块中出现了异常,程序就转移到catch块中执行。
②try-catch-finally语句
try
{
语句序列
}
catch(异常类型 标识符)
{
异常处理
}
finally
{
语句序列
}
static void Main()
{
int x=10,y = 0;
try
{
int z = x / y;
}
catch (Exception e)
{
Console.WriteLine("{0} Caught exception #1.", e);
}
finally
{
Console.WriteLine("Executing finally block.");
}
}