C#入门教程(中)
(二)变量与常量
相信你应该对变量和常量的概念再熟悉不过了,有关变量和常量的知识都是任何一门编程语言的基础知识,而每一门编程语言都有自己相对应的变量和常量的命名规则和使用方式。
1.变量
(1)变量的概念
程序要对数据进行读、写、运算等操作,当需要保存特定的值或计算结果时,就需要用到变量(Variable)。在用户看来,变量是用来描述一条信息的名称,在变量中可以存储各种类型的信息,如姓名、价格、文件的长度等。在计算机中变量代表存储地址,变量的类型决定了存储在变量中的类型,C#是一种安全类型语言,它的编译器存储在变量中的数值具有适当的数据类型。同时,变量的值可以通过赋值被改变。
使用变量的一条重要的原则是:变量必须先定义后使用。
(2)变量的类型
在C#中,我们把变量分为七种:静态变量、非静态变量、局部变量、数组元素、值参数、引用参数和输出参数等。
静态变量:带有“static”修饰符声明的变量称为静态变量。一旦静态变量所属的类被装载,直到包含该类的程序运行结束时它将一直存在。静态变量就是该变量类型的默认值。静态变量最好是在定义时便赋值。如static a =10;
非静态变量:不带有“static”修饰符声明的变量称其为实例变量。如int a;类中的非静态变量,一旦一个类的新的实例被创建,直到该实例不再被应用从而所在空间被释放为止,该非静态变量将一直存在。同样鉴于定义赋值检查,一个类的非静态变量也应该是在初始化的时候赋值。
数组元素:数组元素也是变量的一种,该变量随该数组实例的存在而存在。每一个数组元素的初始值是该数组元素类型的默认值。同样地,鉴于定义赋值检查,数组元素最好是在初始化的时候被赋值。
局部变量:局部变量是指在一个独立的程序块中,一个for语句、switch语句或者using语句中声明的变量,它只在该范围内有效。当程序运行到这个范围内时,该变量即开始生效,程序离开时变量失效。与其他几种变量类型不同的是,局部变量不会自动被初始化,所以也就是没有默认值。在进行赋值检查时,局部变量被认为没有被赋值。
在局部变量的有效范围内,在变量的定义以前就使用是不合法的。如下面的代码:
for(int I=0;I<10;I++){
int num=a; //这是非法的,因为局部变量a还没有被定义
int a;
int b=a;
}
有关值参数、引用参数和输出参数在这里我们不作讨论,有兴趣的读者可以参看相关的书藉。
2.常量
所谓常量就是其值固定不变的量。从数据类型来讲,常量的类型可以是任何一种值类型或者是引用类型。一个常量的声明,就是声明程序中要用到的常量的名称和它的值,与变量一样,我们可以同时声明一个或者多个给定类型的常量。常量声明的格式如下:
attributes constant-modifiers const type constant-declarators;
其中:常量修饰符constant-modifiers可以是:new、public、protected、internal、private。
常量的类型type必须是下面中的一种:
sbyle、byte、short、ushort、int、uint、ulong、char、float、double、decimal、bool、string或是引用类型(reference-type)。
常量表达式constant-declarators表示常量的名字。
如:public const double X=1.0,Y=2.0,Z=3.0;
(三)表达式
C#语言中的表达式类似于数学运算中表达式,它是操作符、操作对象和标点符号等连接而成的式子。操作符是用来定义类实例中表达式操作符的。表达式是指定计算的操作符、操作数序列。
1.操作符的分类
表达式由操作数和操作符组成。表达式的操作符指出了对操作数的操作。比如操作符有+、—、/;操作数可以是文字、域、当前变量或表达式。
依照操作符作用的操作数的个数来分,C#中有一元操作符:作用于一个操作数,包括前缀操作符和后缀操作符;二元操作符:作用于两个操作数,使用时在操作数中插入操作符;三元操作符:只有一个操作符“?:”。作用于三个操作数,使用时在操作数中间插入操作符。
下面分别给出使用操作符的例子:
int x=5,y=10,z;
x++; //后缀一元操作符
--x; //前缀一元操作符
z=x+y; //二元操作符
y=(X>10?0:1); //三元操作符
2.操作符的优先级
当一个表达式包含多样操作符时,操作符的优先级控制着单个操作符求值的顺序。例如,表达式x+y*z按照x+(y*z)求值,因为“*”操作符比“+”操作符有更高的优先级。下表给出了所以操作符从高到底的优先级顺序。
![]()
当一个操作数出现在两个有相同优先级的操作符之间时,操作符按照出现的顺序由左至右执行。除了赋值的操作符,所有的二进制操作符都是按照从左向右的顺序执行。如x+y+z按(x+y)+z进行。
赋值操作符和条件操作符(?:)按照从右向左的顺序执行。如x=y=z按照x=(y=z)进行。
建议:在写表达式时,如果无法确定操作符的有效顺序,则尽量采用括号来保证运算的顺序,这样也使得程序一目了然,而且自己在编程时能够思路清晰。
(四)流程控制
在前面众多的程序代码中,我们的程序都还只能按照编写的顺序执行,中途不能发生任何的变化。为了适应需要,我们经常要转移或者说是要改变程序执行的顺序,达到这些目的的语句就是流程控制语句。
1.条件语句
当程序中需要进行两个或两个以上的选择时,可以根据条件判断来选择将要执行的一组语句。C#提供的选择语句有if语句和switch语句。
(1)if语句
if语句是最常用的选择语句,它根据布尔表达式的值来判断是否执行后面的内嵌语句。其格式为:
if(boolean-expression)embedded-statement或
if(boolean-expression)embedded-statement
else embedded-statement
当布表达式的值为真时,则执行if后面的内嵌语句embedded-statement。为假时则程序继续执行。如果有else语句时,则执行else后面的内嵌语句,否则继续执行下一条语句。
If (x-int(x)>0.5
{
I=int(x)+1;
}
else
{
I=int(x)
}
如果if或者else之后的嵌套语句只包含一条执行语句,则嵌套部分的大括号可以省略。如果包含了两条以上的执行语句,对嵌套部分一定要加上大括号。
如果程序的逻辑判断关系比较复杂,通常会采用条件判断嵌套语句。If语句可以嵌套使用,即是在判断之中又有判断。具体的形式如下:
if(boolean-expression)
{
if(boolean-expression)
{……};
else
{……};
……
}
else
{
if(boolean-expression)
{……};
else
{……}
……
}
此时应注意,每一条else与离它最近且没有其他else与之对应的if相搭配。
(2)Switch语句
if语句每次判断只能实现两条分支,如果要实现多种选择的功能,那么可以采用Switch语句。Switch语句根据一个控制表达式的值选择一个内嵌语句分支来执行。它的一般格式为:
switch(controlling-expression)
{
case constant-expression;
embedded-statements
default;
embedded-statements
}
Switch语句的控制类型,即其中控制表达式(controlling-expression)的数据类型可以是sbyle、byte、short、short、uint、long、ulong、char、string或是枚举类型(rnum-type)。每个case标签中的常量表达式(constant-expression)必须属于或能隐式转换成控制类型。如果有两个或两个以上case标签中的常量表达式值相同,编译时将报错。Switch语句中最多只能有一个default标签。
下面的程序代码说明Swtich语句按所提供参数的数字执行不同的语句。
Using system;
class Test
{
static void Main (string[] args) {
switch (args.Length) {
case 0;
Console.WriteLine ("No arguments were provided");
break;
case 1;
Console.WriteLine ("One arguments was provided");
break;
default;
Console.WriteLine ("{0} arguments were provided");
break;
}
}
}
2.循环语句
循环语句可以实现一个程序模块的重复执行,它对于我们简化程序,更好地组织算法有着重要的意义。C#提供了四种循环语句:While语句、do-while语句、for语句、foreach语句。
(1)While语句
While语句有条件地将内嵌语句执行0遍或若干遍。其格式为:
while (boolean-expression) embedded-statement
其执行的顺序是:
首先计算表达式boolean-expression的值;当布尔表达式的值为真时,执行语句embedded-statement一遍,程序转至第1步;当布尔表达式的值为假时,while循环结束。
(2)do-while语句
do-while语句与while语句不同的是,它将内嵌语句执行一次(至少一次)或若干次。其格式为:
do embedded-statement while(boolean-expression)
其执行的顺序是:
首先执行内嵌语句embedded-statement一遍;当布尔表达式的值为真时则回到第1步,为假时则终止do循环。
在do-while循环语句中同样允许用break语句和continue语句实现与while语句中相同的功能。
(3)for语句
for语句是C#中使用频率最高的循环语句。在事先知道循环次数的情况下,使用for语句是比较方便的。其格式为:
for(inttializer,condinton;iterator)embedded-statement
其中inttializer、condinton、iterator三项是可选项。Inttializer为循环控制变量做初始化,循环控制变量可以有一个或多个(用逗号隔开);condinton为循环控制条件,也可以有一个或多个语句;iterator按规律改变控制变量的值。
其执行的顺序是:
首先按照书写顺序将inttializer部分(如果有)执行一遍,为循环控制变量赋初值;然后测试condinton(如果有)中的条件是否满足;若没有condinton项或条件满足,则执行内嵌语句一遍,按iterator改变循环控制变量的值,回到第2步执行;若条件不满足,则for循环终止。
下面的程序代码说明用一个for语句写出整数1~10。
Using System;
class Test
{
static void Main(){
for (int I=0; I<10; I++)
Console.WriteLine(I);
}
}
相信你应该对变量和常量的概念再熟悉不过了,有关变量和常量的知识都是任何一门编程语言的基础知识,而每一门编程语言都有自己相对应的变量和常量的命名规则和使用方式。
1.变量
(1)变量的概念
程序要对数据进行读、写、运算等操作,当需要保存特定的值或计算结果时,就需要用到变量(Variable)。在用户看来,变量是用来描述一条信息的名称,在变量中可以存储各种类型的信息,如姓名、价格、文件的长度等。在计算机中变量代表存储地址,变量的类型决定了存储在变量中的类型,C#是一种安全类型语言,它的编译器存储在变量中的数值具有适当的数据类型。同时,变量的值可以通过赋值被改变。
使用变量的一条重要的原则是:变量必须先定义后使用。
(2)变量的类型
在C#中,我们把变量分为七种:静态变量、非静态变量、局部变量、数组元素、值参数、引用参数和输出参数等。
静态变量:带有“static”修饰符声明的变量称为静态变量。一旦静态变量所属的类被装载,直到包含该类的程序运行结束时它将一直存在。静态变量就是该变量类型的默认值。静态变量最好是在定义时便赋值。如static a =10;
非静态变量:不带有“static”修饰符声明的变量称其为实例变量。如int a;类中的非静态变量,一旦一个类的新的实例被创建,直到该实例不再被应用从而所在空间被释放为止,该非静态变量将一直存在。同样鉴于定义赋值检查,一个类的非静态变量也应该是在初始化的时候赋值。
数组元素:数组元素也是变量的一种,该变量随该数组实例的存在而存在。每一个数组元素的初始值是该数组元素类型的默认值。同样地,鉴于定义赋值检查,数组元素最好是在初始化的时候被赋值。
局部变量:局部变量是指在一个独立的程序块中,一个for语句、switch语句或者using语句中声明的变量,它只在该范围内有效。当程序运行到这个范围内时,该变量即开始生效,程序离开时变量失效。与其他几种变量类型不同的是,局部变量不会自动被初始化,所以也就是没有默认值。在进行赋值检查时,局部变量被认为没有被赋值。
在局部变量的有效范围内,在变量的定义以前就使用是不合法的。如下面的代码:
for(int I=0;I<10;I++){
int num=a; //这是非法的,因为局部变量a还没有被定义
int a;
int b=a;
}
有关值参数、引用参数和输出参数在这里我们不作讨论,有兴趣的读者可以参看相关的书藉。
2.常量
所谓常量就是其值固定不变的量。从数据类型来讲,常量的类型可以是任何一种值类型或者是引用类型。一个常量的声明,就是声明程序中要用到的常量的名称和它的值,与变量一样,我们可以同时声明一个或者多个给定类型的常量。常量声明的格式如下:
attributes constant-modifiers const type constant-declarators;
其中:常量修饰符constant-modifiers可以是:new、public、protected、internal、private。
常量的类型type必须是下面中的一种:
sbyle、byte、short、ushort、int、uint、ulong、char、float、double、decimal、bool、string或是引用类型(reference-type)。
常量表达式constant-declarators表示常量的名字。
如:public const double X=1.0,Y=2.0,Z=3.0;
(三)表达式
C#语言中的表达式类似于数学运算中表达式,它是操作符、操作对象和标点符号等连接而成的式子。操作符是用来定义类实例中表达式操作符的。表达式是指定计算的操作符、操作数序列。
1.操作符的分类
表达式由操作数和操作符组成。表达式的操作符指出了对操作数的操作。比如操作符有+、—、/;操作数可以是文字、域、当前变量或表达式。
依照操作符作用的操作数的个数来分,C#中有一元操作符:作用于一个操作数,包括前缀操作符和后缀操作符;二元操作符:作用于两个操作数,使用时在操作数中插入操作符;三元操作符:只有一个操作符“?:”。作用于三个操作数,使用时在操作数中间插入操作符。
下面分别给出使用操作符的例子:
int x=5,y=10,z;
x++; //后缀一元操作符
--x; //前缀一元操作符
z=x+y; //二元操作符
y=(X>10?0:1); //三元操作符
2.操作符的优先级
当一个表达式包含多样操作符时,操作符的优先级控制着单个操作符求值的顺序。例如,表达式x+y*z按照x+(y*z)求值,因为“*”操作符比“+”操作符有更高的优先级。下表给出了所以操作符从高到底的优先级顺序。
当一个操作数出现在两个有相同优先级的操作符之间时,操作符按照出现的顺序由左至右执行。除了赋值的操作符,所有的二进制操作符都是按照从左向右的顺序执行。如x+y+z按(x+y)+z进行。
赋值操作符和条件操作符(?:)按照从右向左的顺序执行。如x=y=z按照x=(y=z)进行。
建议:在写表达式时,如果无法确定操作符的有效顺序,则尽量采用括号来保证运算的顺序,这样也使得程序一目了然,而且自己在编程时能够思路清晰。
(四)流程控制
在前面众多的程序代码中,我们的程序都还只能按照编写的顺序执行,中途不能发生任何的变化。为了适应需要,我们经常要转移或者说是要改变程序执行的顺序,达到这些目的的语句就是流程控制语句。
1.条件语句
当程序中需要进行两个或两个以上的选择时,可以根据条件判断来选择将要执行的一组语句。C#提供的选择语句有if语句和switch语句。
(1)if语句
if语句是最常用的选择语句,它根据布尔表达式的值来判断是否执行后面的内嵌语句。其格式为:
if(boolean-expression)embedded-statement或
if(boolean-expression)embedded-statement
else embedded-statement
当布表达式的值为真时,则执行if后面的内嵌语句embedded-statement。为假时则程序继续执行。如果有else语句时,则执行else后面的内嵌语句,否则继续执行下一条语句。
If (x-int(x)>0.5
{
I=int(x)+1;
}
else
{
I=int(x)
}
如果if或者else之后的嵌套语句只包含一条执行语句,则嵌套部分的大括号可以省略。如果包含了两条以上的执行语句,对嵌套部分一定要加上大括号。
如果程序的逻辑判断关系比较复杂,通常会采用条件判断嵌套语句。If语句可以嵌套使用,即是在判断之中又有判断。具体的形式如下:
if(boolean-expression)
{
if(boolean-expression)
{……};
else
{……};
……
}
else
{
if(boolean-expression)
{……};
else
{……}
……
}
此时应注意,每一条else与离它最近且没有其他else与之对应的if相搭配。
(2)Switch语句
if语句每次判断只能实现两条分支,如果要实现多种选择的功能,那么可以采用Switch语句。Switch语句根据一个控制表达式的值选择一个内嵌语句分支来执行。它的一般格式为:
switch(controlling-expression)
{
case constant-expression;
embedded-statements
default;
embedded-statements
}
Switch语句的控制类型,即其中控制表达式(controlling-expression)的数据类型可以是sbyle、byte、short、short、uint、long、ulong、char、string或是枚举类型(rnum-type)。每个case标签中的常量表达式(constant-expression)必须属于或能隐式转换成控制类型。如果有两个或两个以上case标签中的常量表达式值相同,编译时将报错。Switch语句中最多只能有一个default标签。
下面的程序代码说明Swtich语句按所提供参数的数字执行不同的语句。
Using system;
class Test
{
static void Main (string[] args) {
switch (args.Length) {
case 0;
Console.WriteLine ("No arguments were provided");
break;
case 1;
Console.WriteLine ("One arguments was provided");
break;
default;
Console.WriteLine ("{0} arguments were provided");
break;
}
}
}
2.循环语句
循环语句可以实现一个程序模块的重复执行,它对于我们简化程序,更好地组织算法有着重要的意义。C#提供了四种循环语句:While语句、do-while语句、for语句、foreach语句。
(1)While语句
While语句有条件地将内嵌语句执行0遍或若干遍。其格式为:
while (boolean-expression) embedded-statement
其执行的顺序是:
首先计算表达式boolean-expression的值;当布尔表达式的值为真时,执行语句embedded-statement一遍,程序转至第1步;当布尔表达式的值为假时,while循环结束。
(2)do-while语句
do-while语句与while语句不同的是,它将内嵌语句执行一次(至少一次)或若干次。其格式为:
do embedded-statement while(boolean-expression)
其执行的顺序是:
首先执行内嵌语句embedded-statement一遍;当布尔表达式的值为真时则回到第1步,为假时则终止do循环。
在do-while循环语句中同样允许用break语句和continue语句实现与while语句中相同的功能。
(3)for语句
for语句是C#中使用频率最高的循环语句。在事先知道循环次数的情况下,使用for语句是比较方便的。其格式为:
for(inttializer,condinton;iterator)embedded-statement
其中inttializer、condinton、iterator三项是可选项。Inttializer为循环控制变量做初始化,循环控制变量可以有一个或多个(用逗号隔开);condinton为循环控制条件,也可以有一个或多个语句;iterator按规律改变控制变量的值。
其执行的顺序是:
首先按照书写顺序将inttializer部分(如果有)执行一遍,为循环控制变量赋初值;然后测试condinton(如果有)中的条件是否满足;若没有condinton项或条件满足,则执行内嵌语句一遍,按iterator改变循环控制变量的值,回到第2步执行;若条件不满足,则for循环终止。
下面的程序代码说明用一个for语句写出整数1~10。
Using System;
class Test
{
static void Main(){
for (int I=0; I<10; I++)
Console.WriteLine(I);
}
}