C#教程第二课:表达式,类型和变量

(Joe Mayo 2001年06月08日 17:32)

本节课将介绍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. 下列表格显示了各种整数类型,所占字节大小和所能表示的数的范围。

    类型范围
    sbyte8-128 to 127
    byte80 to 255
    short16-32768 to 32767
    ushort160 to 65535
    int32-2147483648 to 2147483647
    uint320 to 4294967295
    long64-9223372036854775808 to 9223372036854775807
    ulong640 to 18446744073709551615
    char160 to 65535

    在对整数进行计算时,除了字符类型之外,上述这些类型都是适合的。字符类型代表一个Unicode字符。正如在上表中可以看到的,你可以从中选择适合你需要的类型。

  3. 下列表格显示了单精度类型,双精度类型和小数类型的数据,它们所占的字节,精度和所能表示的数的范围。

    类型精度范围
    float327 digits1.5 x 10-45 to 3.4 x 1038
    double6415-16 digits5.0 x 10-324 to 1.7 x 10308
    decimal12828-29 decimal places1.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#的运算符构成表达式。

(责任编辑:DawnSummit guixf@staff.ccidnet.com)

Contributors: FHL