C基础答疑资料Word文件下载.docx
《C基础答疑资料Word文件下载.docx》由会员分享,可在线阅读,更多相关《C基础答疑资料Word文件下载.docx(28页珍藏版)》请在冰豆网上搜索。
命名规则的第三条其实在写程序的时候系统会自动提示你的错误的,所以不必过于担心。
•例子:
•C#.NET对于大小写字母是敏感的,所以在声明以及使用变量的时候要注意这些,例如Variable、variable、VARIABLE是3个不同的变量。
•命名规范:
–Pascal(帕斯卡命名法)
首字母和后面的每个单词的首字母都大写,其他字母小写。
–Camel(骆驼命名法)
首字母小写,而后面的每个单词的首字母大写,其他字母小写。
•一般类名和方法用Pascal命名法,变量和方法参数使用Camel命名法;
•不要使用匈牙利方法来命名变量(如:
stringm_sName;
intnAge),这种方式在.NET编码规范中是不推荐的;
•可根据公司或项目组的约定来选择规范
•命名法举例:
–下面是Pascal命名法的举例:
•Age
•SumOfApple
•DayOfWeek
–下面是camel命名法的举例:
•age
•sumOfApple
•dayOfWeek
2.1.3变量的种类
•在C#语言中,我们把变量分为七种类型,分别是:
静态变量(StaticVariables)
非静态变量(InstanceVariables)
数组元素(ArrayElements)
值参数(ValueParameters)
引用参数(ReferenceParameters)
输出参数(OutputParameters)
局部变量(LocalVariables)。
•类型的例子:
classmyClass
{
inty=2;
publicstaticintx=1;
boolFunction(int[]s,intm,refinti,outintj)
{
intw=2;
j=x+y+i+w;
}
上面的代码中,x是静态变量,y是非静态变量,s[0]是数组元素,m是值参数,i是引用参数,j是输出参数,w是局部变量。
•非静态变量
–不带有static修饰符声明的变量称为实例变量(非静态变量)。
如:
•ints=2;
–针对类中的非静态变量而言,一旦一个类的新的实例被创建,直到该实例不再被应用从而所在空间被释放为止,该非静态变量将一直存在。
同样鉴于定义赋值检查,一个类的非静态变量也应该在初始化时赋值。
•静态变量
–带有static修饰符声明的变量为静态变量。
一旦静态变量所属的类被装载,直到包含该类的程序运行结束时,它将一直存在。
静态变量的初始值就是该变量的默认值。
为了便于定义赋值检查,静态变量最好在定义时赋值。
•publicstaticints=5;
–使用静态变量时,不需要对其所在的类进行实例化(即不使用new关键词)就可以直接通过类来使用。
•关于使用静态变量的一个例子
使用静态变量记录进入会场的人数。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceStaticVariable
classPeople
publicintnum;
//用来记录是第几个人
publicstaticintTotalPeople=0;
//static静态变量,记录进入会场人员总数
//static静态方法
publicstaticvoidShowTotalPeople()
Console.WriteLine("
现在共有{0}个人进入会场"
TotalPeople);
publicvoidShowQuery(stringname)
{0}是第{1}个进入会场的人"
name,num);
}
//构造函数
publicPeople()
TotalPeople++;
num=TotalPeople;
//析构函数
~People()
TotalPeople--;
staticvoidMain(string[]args)
People.ShowTotalPeople();
//格林先生进入会场
PeopleMrGreen=newPeople();
MrGreen是第{0}个进会场的人"
MrGreen.num);
PeopleMrSmith=newPeople();
PeopleMrAllen=newPeople();
MrSmith.ShowQuery("
MrSmith"
);
MrAllen.ShowQuery("
MrAllen"
PeoplepPeople;
pPeople=MrSmith;
pPeople.ShowQuery("
pPeople"
Console.ReadLine();
}
•关于使用静态变量的一个例子
运行结果
•数组元素
–数组元素也是变量的一种,该变量随该数组实例的存在而存在。
每一个数组元素的初始值都是该数组元素类型的默认值。
同样鉴于定义赋值检查,数组元素最好在初始时被赋值。
•局部变量
–局部变量是指一个独立的程序块,一个For语句,一个Switch语句或者Using语句中声明的变量,它只在该范围内有效。
当程序运行到这一范围时,该变量即开始生效,程序离开时变量就失效了。
–与其他几种变量类型不同的是,局部变量不会自动被初始化,所以也就没有默认值,在进行赋值检查的时候,局部变量被认为是没有被赋值。
2.1.4变量类型之间的转换
•在程序的设计中,常常会遇到变量的类型转换问题。
比如在进行数学四则运算时,int类型的数值和double类型的数值可能混在一起进行运算,这样变量之间的类型转换就应运而生。
•四种方式:
–隐式转换
–强制类型转换
–ToString()方法
–Convert类
•隐式转换
–隐式转换又称自动类型转换,若两种变量的类型是兼容的或者目标类型的取值范围大于源类型时就可以使用隐式转换。
•隐式转换的数据源类型以及目标类型对应表
2.1.4变量类型之间的转换
•强制类型转换
–在程序的编写以及应用时,我们会发现上面讲述的隐式转换不能满足所有的需要,很多时候还是需要强制类型转换的。
强制类型转换是一种指令,它告诉编译器将一种类型转换为另外一种类型。
强制转换的缺点是可能产生的结果不够精确。
–具体的强制类型转换语法为:
(target-type)变量或表达式;
doublei=3.4;
intj=(int)i;
•类型转换小例子
–程序代码:
–usingSystem;
–usingSystem.Collections.Generic;
–usingSystem.Text;
–namespaceImolicitConversion
–{
–classProgram
–{
–staticvoidMain(string[]args)
–inti=2;
–doubled=3.4;
–intv1=(int)(i+d);
–doublev2=i+d;
–Console.WriteLine("
v1={0},v2={1}"
v1,v2);
–Console.ReadLine();
–}
–}
–运行结果为:
v1=5,v2=5.4。
•ToString()方法
–ToString()方法主要用于将变量转化为字符串类型,该方法是C#语言中非常常见的一个方法。
–前面我们介绍的各种类型的变量都可以通过ToString()方法转换为String类型,具体看下面一个把int型变量转化为string类型的小例子:
inti=200;
strings=i.ToString();
这样字符串类型变量s的值就是”200”。
•Convert类
–前面介绍了ToString()方法,并且给出了int类型转化为string类型的实例,可是细心的读者会发现,这个方法无法实现逆向,即无法把一个string类型的转化为int类型的。
下面介绍个可以解决上述问题的方法——使用Convert类进行显示转换。
•Convert类的常见方法
(1)
Convert类的常见方法
(2)
2.2常量
•常量就是值在程序整个生命周期内值始终不变的量。
在声明常量时,要用到Const关键字。
常量在使用的过程中,不可以对其进行赋值的改变,否则系统会自动报错。
•常量声明的基本语法为:
[private/public/internal/protected]const[int/double/long/bool/string/……]VariableName;
•下面是一个具体声明常量的例子:
privateconstdoublePI=3.1415926;
2.3表达式
•C#中的表达式是由运算符、变量以及标点符号依据一定的法则组合创建起来的。
运算符主要是用来定义类实例中表达式操作符的。
运算符的范围非常之广泛,简单的复杂的都有。
•在本节中,主要介绍数学运算符和赋值运算符。
2.3.1数学运算符
•C#中的数学运算符有5种:
–+加法运算符
–—减法运算符
–*乘法运算符
–/除法运算符
–%取余运算符
•上面的5种运算符都是二元的,但是“+”与“—”运算符也可以是一元的,具体用法如下:
inti=1;
i++;
此时i的值就变为了2,i++这个表达式可以解释为i=i+1;
2.3.1数学运算符
•表达式++i与i++的含义又有不同,下面的例子简单明了地解释了。
inti=1;
intj;
j=++i;
此程序运行的结果是:
j=2;
j=i++;
j=1;
•通过对以上2个简单程序的对比,可以得知表达式i++是先赋值,后进行自身的运算,而++i正好是相反的,先进行自身的运算,而后再赋值。
•加法运算符
–加法运算符可以运用于整数类型、实数类型、枚举类型、字符串类型和代表类型。
在这里我们只需要知道这些操作符可以对不同类型的变量进行运算就可以了。
–我们知道,在数学运算中,结果可能是正无穷大、负无穷大,当然,也可能结果不存在。
在C#中,在处理这些特殊情况的时候,假设表达式为Z=X+Y,,X与Y都是非0的有限值,如果X和Y数值相等,符号相反,则Z为正0,如果X+Y结果太大,那么目标类型Z就被认作和X+Y符号相同的无穷。
如果X+Y太小,目标类型也无法表示,则Z为和X+Y同符号的零值。
•减法运算符、乘法运算符、除法运算符与上面所讲的加法运算符很类似,在这里就不再赘述。
另外,有几点还是需要注意的,乘法运算符、除法运算符只适用于整数以及实数之间的操作;
而且在除法运算符使用的时候,默认的返回值的类型与精度最高的操作数类型相同。
比如,5/2的结果是2,而5.0/2的结果是2.5。
如果两个整数类型的变量相除又不能整除的话,返回的结果是不大于相除之值的最大整数。
•取余运算符
–取余运算符用来求除法的余数,在C#语言中,求模运算既适用于整数类型,也同样适用于浮点型。
如7%3的结果为1,7%1.5的结果为1。
2.3.2赋值运算符
•赋值运算符分为2种类型,第一种是简单赋值运算符,就是我们前面在程序里面已经使用多次的“=”号;
第二种是复合赋值运算符,包含5类,具体的如下表所示:
2.3.3运算符的优先级
•其实在小学数学的学习中,我们就涉及了运算符优先级的内容,那时叫做四则运算,口诀是:
先乘除、后加减,有括号先算括号里面的。
在程序语言中,也完全符合这道口诀。
•但是需要我们注意的是:
程序中的运算符要比数学中多一些,比如说:
++、%等运算符号。
另外数学运算符的优先级要排在赋值运算符之前,举几个例子可能说明的更清楚些:
a=(b+c)*d;
在这个代码中是先计算b与c的和,再用这个和与d进行相乘,得到的积赋值给a。
a%=(++b-c*d)%e;
这个代码我们可以改写为:
a=a%((++b-c*d)%e);
这样我们就可以按照基本的运算法则来求了。
•几种运算符优先级的比较
2.4变量类型
•在C#语言中,变量类型可以分为两大部分:
–值类型(valuetype)
–引用类型(referencetype)
2.4.1值类型
•值类型:
值类型变量直接存储其数据值
•C#中,值类型可以分为以下几种:
–简单类型(SimpleTypes)
–结构类型(structTypes)
–枚举类型(EnumerationTypes)
•简单类型:
分为
–整数类型
整数类型,顾名思义,就是变量的值为整数的值类型。
计算机语言中的整数跟数学上的整数定义有点差别,这是由于计算机的存储单元有限导致的。
C#语言中的整数类型分为8类:
短字节型(Sbyte)、字节型(Byte)、短整型(Short)、无符号短整型(Ushort)、整型(Int)、无符号整型(Uint)、长整型(Long)、无符号长整型(Ulong)。
一些变量名称前面的“u”是“Unsigned”的缩写,表示不能在这些类型的变量中存储负号。
这些不同的整数类型可以用于存储不同范围的数值,占用不同的内存空间。
–布尔类型
在C#语言中,布尔类型只有2类,即“True”与“False”。
在编写应用程序的逻辑流程时(通俗地讲,就是在判断某条件是符合逻辑的还是不符合逻辑的),布尔型的变量有着非常重要的分支作用。
–字符类型
字符包括数字字符,英文字母、表达符号等等。
C#提供的字符类型按照国际上公认的标准,采用Unicode字符集
–实数类型
在C#中,实数类型分为单精度(Float)、双精度(Double)和十进制类型(Decimal),它们的差别在于取值范围和精度不同。
计算机对实数的运算速度大大低于对整数的运算。
在对精度要求不高的计算中,我们可以采用单精度型,而采用双精度的结果将更为精确。
Decimal类型主要用于方便我们在金融和货币方面的计算。
•结构类型
–一个结构类型可以声明构造函数、常数、字段、方法、属性、索引、操作符和嵌套类型。
尽管列出来的功能看起来像一个成熟的类,但是在C#中,结构和类的区别在于结构是一个值类型,而类是一个引用类型。
•结构类型的定义
–定义结构和定义类几乎是完全一样的,具体见下面的例子。
structmyColor
publicintRed;
publicintGreen;
publicintBlue;
•结构类型的使用
–我们看上面的声明很像一个类。
可以这样来使用所定义的这个结构。
myColormc;
mc.Red=255;
mc.Green=0;
mc.Red=0;
mc就是一个myColor结构类型的变量。
•枚举类型
–枚举(Enum)实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号。
当我们希望变量提取的是一个固定集合中的值时,我们就可以使用枚举。
例如,我们可以定义一个代表手机的枚举类型。
enumMobilePhone
{Nokia,MotoRola,TCL,LG,Bird,NEC,Apple};
这时我们就可以声明MobilePhone这个枚举类型的变量。
MobilePhonemp;
2.4.1值类型
•枚举类型与结构类型的比较
–结构是由不同类型的数据组成的一组新的数据类型,结构类型的变量的值是由各个成员的值组合而成。
而枚举则不同,枚举类型的变量在某一时刻只能取枚举中某一个元素的值。
2.4.1引用类型
•引用类型:
引用变量存储的是数据的引用(地址)
•C#中的引用类型有4种:
–类
–数组
–委托
–接口
这4种引用类型我们在以后的章节里都会详细地介绍。
小结
本章的主要内容是变量以及表达式,主要介绍了变量的声明、使用方法以及注意事项;
还特别介绍了运算符的优先级。
最后,我们介绍了变量类型:
值类型以及引用类型
分支和循环控制
1.流程控制语句的分类
2.选择结构控制语句
3.循环结构控制语句
4.跳转控制语句
1流程控制语句分类
•在C#语言中,流程控制语句主要分为以下几类:
–选择结构控制语句:
If语句、Switch语句。
–循环结构控制语句:
Do循环语句、While循环语句、for循环语句、Foreach语句等。
–跳转控制语句:
Break语句、Continue语句、Goto语句、Return语句。
2选择结构控制语句
•主要包括If语句以及Switch语句
2.1If语句
If语句有3种基本形式:
单条选择、如果/否则、多情形选择。
1.单条选择If语句
单条选择的If语句是最简单的If语句,基本语法如下:
if(booleanexpression)
……;
该语句必须以关键字If开始,之后,括号内为布尔表达式。
该表达式必须计算出一个True或者False值。
若为True,则执行If后面的大括号中的语句,否则,就跳过这些大括号中的语句。
2.如果/否则If语句
如果/否则If语句的基本语法如下:
表达式A;
Else
表达式B;
这个语句和第一种很类似,根据If语句后面括号内的值,若为True,则执行表达式A,否则就执行表达式B。
3.多情形选择的If语句
多情形选择的If语句实际上是第2种形式的嵌套。
在选择的时候常常是有多种情况,这些情况有不同的指令。
基本语法为:
if(booleanexpression1)
表达式A;
elseif(booleanexpression2)
表达式B;
elseif(booleanexpression3)
表达式C;
…………
表达式N;
程序执行时,首先判断If语句后面括号中的expression1,若值为True,则执行表达式A语句,若值为False,就跳向下一个语句,判断ElseIf语句后面的expression2,若为True,就执行表示B语句,否则就继续向下,若到最后的Else语句之前还没有遇到语句为True的,就要执行Else语句后面大括号中的表示式N了。
2.2Switch语句
•Switch语句
–Switch语句非常类似于If语句,因为它也是根据测试的值来有条件地执行代码。
实际上,每一个由Switch语句组成的代码,都可以用If语句进行改写。
但是,Switch语句也有它特殊的地方,它可以一次将测试变量与多个值进行比较,而不仅仅是测试一个条件。
这种测试仅限于离散的值,而不是像“小于10”这样的子句。
•Switch语句的基本语法为
switch(switch_expression)
casevalue1:
{statement1;
break;
casevalue2:
{statement2;
……
casevalueN:
{statementN;
[default]
要记住两个主要规则。
首先,switch_expression必须是(或者能够隐式地转换为)Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、String类型或者在这些类型上的一个枚举。
其次,必须为每个Case语句添加一个Break语句。
在执行Switch语句的过程中,先把Switch后面括号内的表达式switch_expression依次与case后面的表达式进行比较,如果遇到匹配的,则就执行为该匹配提供的语句。
如果没有匹配的,就执行Default部分中的代码。
Break语句的作用是中断当前Switch语句的运行,而执行该结构后面的语句。
没有break这个关键字的时候,程序则会发生意想不到的错误。
•Switch语句的控制结构图
•Switch语句使用的一个小例子
namespaceswitchExample
classProgram
intfirstData;
intsecon