本节课将介绍c# 语言的表达式,类型和变量。本节课要达到如下几个目的:
1.了解什么是"变量"
2.学习c#的简单类型
3.对c#表达式有个初步的了解
4.了解什么是string类型
5.学习如何使用数组
"变量"仅仅是数据的存储位置。你可以把数据存放到其中,或者从中取出来作为c#表达式的一部分。变量中所存放的数据的含义是通过类型来控制的。
c#是个强类型(???)的语言。这样,一切对变量的操作都是针对该变量的类型而进行的。为了保证变量中所存放数据的合法性和一致性,对不同类型的变量进行操作有相应的规则。
c#语言的简单类型包含布尔类型和三种数值类型:整型,浮点型和小数。
1.清单1-1 显示布尔值:boolean.cs
using system;
class booleans {
public static void main() {
bool content = true;
bool nocontent = false;
console.writeline("it is {0} that c# station provides c# programming language content.", content);
console.writeline("the statement above is not {0}.", nocontent);
}
}
说明
1.在清单1-1中,布尔值作为句子的一部分输出到控制台中。"bool"类型的取值要么为真,要么为假。程序运行结果如下:
>it is true that c# station provides c# programming language content.
>the statement above is not false.
2.下列表格显示了各种整数类型,所占字节大小和所能表示的数的范围。
类型 位 范围
sbyte 8 -128 to 127
byte 8 0 to 255
short 16 -32768 to 32767
ushort 16 0 to 65535
int 32 -2147483648 to 2147483647
uint 32 0 to 4294967295
long 64 -9223372036854775808 to 9223372036854775807
ulong 64 0 to 18446744073709551615
char 16 0 to 65535
在对整数进行计算时,除了字符类型之外,上述这些类型都是适合的。字符类型代表一个unicode字符。正如在上表中可以看到的,你可以从中选择适合你需要的类型。
3.下列表格显示了单精度类型,双精度类型和小数类型的数据,它们所占的字节,精度和所能表示的数的范围。
类型 位 精度 范围
float 32 7 digits 1.5 x 10-45 to 3.4 x 1038
double 64 15-16 digits 5.0 x 10-324 to 1.7 x 10308
decimal 128 28-29 decimal places 1.0 x 10-28 to 7.9 x 1028
当你需要进行涉及到分数的操作时,就需要用到实型,然而,对于金融财经方面的数据的计算,小数类型也许是你最好的选择。
4.表达式计算之后可以得出结果。这些表达式把变量和运算符一同放到语句中。下表列出了c#允许的运算符,优先级和结合性。
分类 运算符 结合性
初级 (x) x.y f(x) a[x] x++ x-- new typeof sizeof checked unchecked 左
单目 + - ! ~ ++x --x (t)x 左
乘法等 * / % 左
加法等 + - 左
移位 << >> 左
关系 < > <= >= is 左
相等 == != 右
逻辑与 & 左
逻辑异或 ^ 左
逻辑或 | 左
条件与 && 左
条件或 || 左
条件 ?: 右
赋值等 = *= /= %= += -= <<= >>= &= ^= |= 右
左结合意味着运算符是从左到右进行运算的。右结合意味着所有的运算是从右到左进行的,如赋值运算符,要等到其右边的计算出来之后,才把结果放到左边的变量中。
2.清单 1-2. 单目运算符: unary.cs
using system;
class unary {
public static void main() {
int unary = 0;
int preincrement;
int predecrement;
int postincrement;
int postdecrement;
int positive;
int negative;
sbyte bitnot;
bool lognot;
preincrement = ++unary;
console.writeline("pre-increment: {0}", preincrement);
predecrement = --unary;
console.writeline("pre-decrement: {0}", predecrement);
postdecrement = unary--;
console.writeline("post-decrement: {0}", postdecrement);
postincrement = unary++;
console.writeline("post-increment: {0}", postincrement);
console.writeline("final value of unary: {0}", unary);
positive = -postincrement;
console.writeline("positive: {0}", positive);
negative = +postincrement;
console.writeline("negative: {0}", negative);
bitnot = 0;
bitnot = (sbyte)(~bitnot);
console.writeline("bitwise not: {0}", bitnot);
lognot = false;
lognot = !lognot;
console.writeline("logical not: {0}", lognot);
}
}
说明
1.当计算表达式的时候,在后置增一和后置减一运算符进行运算时,先返回其值,再进行增一或者减一运算。当使用前置加号和减号运算符进行运算时,是先进行增一或者减一的运算,然后再返回其结果值。
2.在清单1-2中, 变量unary初始化为0,进行++x 运算时,"unary"的值加1,再把其值1赋给"preincrement"变量。在进行--x运算时,先把"unary"的值减到0, 再把值0赋给"predecrement"变量。
3.进行x-运算时,先把"unary"的值0赋给"postdecrement" 变量,之后再把"unary"减到-1。进行x++运算时,先把"unary"的值-1赋给"postincrement"变量,之后再对"unary"加1,使得"unary"变量现在的值为0。
4.变量"bitnot"初始值为0,进行按位取反运算,本例中,数0表示为二进制"00000000",按位取反之后变为-1,其二进制表示为"11111111"。
5.了解一下表达式"(sbyte)(~bitnot)", 任何对类型sbyte, byte, short 或者 ushort 类型数据的运算,返回结果都是整数。要把值赋给bitnot变量,我们必须使用cast (类型)运算符(强制类型转换),其中type表示你希望转换成的类型(本例中为sbyte)。 cast运算符把大范围类型的数据转换为小范围类型的数据时,须特别谨慎,因为此时有丢失数据的危险。一般来说,把小类型的数据赋给大类型变量,并没有问题, 因为大范围数据类型的变量具有足够的空间存放小类型数据。 注意在signed 和unsigned类型之间进行cast运算时,也存在此类危险。 许多初级程序设计教程对变量的位表示作出了很好的讲解,同时也介绍了直接进行cast运算的危险。
逻辑非(!)运算符可以处理布尔变量值。本例中,"lognot"变量从false 变为true。
上述程序的输出结果如下:
>pre-increment: 1
>pre-decrement 0
>post-decrement: 0
>post-increment -1
>final value of unary: 0
>positive: 1
>netative: -1
>bitwise not: -1
>logical not: true
3.清单 1-3. 二元运算符 binary.cs
using system;
class binary {
public static void main() {
int x, y, result;
float floatresult;
x = 7;
y = 5;
result = x+y;
console.writeline("x+y: {0}", result);
result = x-y;
console.writeline("x-y: {0}", result);
result = x*y;
console.writeline("x*y: {0}", result);
result = x/y;
console.writeline("x/y: {0}", result);
floatresult = (float)x/(float)y;
console.writeline("x/y: {0}", floatresult);
result = x%y;
console.writeline("x%y: {0}", result);
result += x;
console.writeline("result+=x: {0}", result);
}
}
说明
清单1-3 演示了二元操作符的几个例子。加法(+),减法(-),乘法(*)和除法(/)的运算结果,就是我们通常进行的的四则运算的结果。
因为"floatresult"变量是浮点运算类型,所以整型变量"x"和"y" 被强制转换成浮点类型来计算floatresult。
这里有个求余数的运算符,两个操作数相除,返回余数。
最后一条语句给出了另外一种赋值形式,这里用了(+=)运算符.无论什么时候你使用(+=)运算符,那么这个二进制运算符就应该在运算符左右两边都进行运算,然后把值赋给左边的参数。本语句相当于"result = result + x",并返回同样的值。
前面的课程中,你看到的使用次数较多的一种类型是"string" (字符串)类型。"string"类型是由包含在引号内的unicode编码的字符构成。例如"this is a string."
另外一种数据类型是数组。数组可以看成是同种类型的元素构成的集合。当声明数组时,你要指定类型名,数组名,维数和数组大小。
4.清单 1-4. array operations: array.cs
using system;
class array {
public static void main() {
int[] myints = { 5, 10, 15 };
bool[][] mybools = new bool[2][];
mybools[0] = new bool[2];
mybools[1] = new bool[1];
double[,] mydoubles = new double[2, 2];
string[] mystrings = new string[3];
console.writeline("myints[0]: {0}, myints[1]: {1}, myints[2]: {2}", myints[0], myints[1], myints[2]);
mybools[0][0] = true;
mybools[0][1] = false;
mybools[1][0] = true;
console.writeline("mybools[0][0]: {0}, mybools[1][0]: {1}", mybools[0][0], mybools[1][0]);
mydoubles[0, 0] = 3.147;
mydoubles[0, 1] = 7.157;
mydoubles[1, 1] = 2.117;
mydoubles[1, 0] = 56.00138917;
console.writeline("mydoubles[0, 0]: {0}, mydoubles[1, 0]: {1}", mydoubles[0, 0], mydoubles[1, 0]);
mystrings[0] = "joe";
mystrings[1] = "matt";
mystrings[2] = "robert";
console.writeline("mystrings[0]: {0}, mystrings[1]: {1}, mystrings[2]: {2}", mystrings[0], mystrings[1], mystrings[2]);
}
}
说明
清单 1-4 演示了数组的各种不同实现方法。第一个例子是"myints"数组,它在声明的同时进行了初始化。
接着是个二维数组,可以把它理解为数组的数组。我们需要使用"new"运算符来实例化初始数组的大小,之后,再对每个子数组使用new运算符。
第三个例子是个二维数组。数组可以是多维的,每一维可以通过逗号隔开,也必须用"new"运算符进行实例化。
最后定义了一个一维的字符串数组。
每种情况下,对于数据元素的访问可以通过引用元素的位置(下标)来进行。数组的大小可以是任何整型值。其下标从0开始。
小结
到现在为止,你已经了解了c# 的变量,简单数据类型,数组和字符串。我们还学习了如何用c#的运算符构成表达式。