运算符(C# 与 Java)

更新:2007 年 11 月

C# 提供 Java 支持的所有适用的运算符,如下表所示。在表的最后,您会看到在 C# 中可用但 Java 中没有的一些新运算符:

类别

符号

一元

++--+-!~()

乘法

*/%

加法

+ -

移位

<< >>

关系

< > <= >= instanceof

相等

== !=

逻辑“与”

&

逻辑 XOR

^

逻辑“或”

|

条件 AND

&&

条件 OR

||

条件运算

? :

赋值

= *= /= %= += -= <<= >>= &= ^= |=

操作数类型

typeof

操作数大小

sizeof

执行溢出检查

checked

取消溢出检查

unchecked

唯一不能在 C# 中使用的 Java 运算符是移位运算符 (>>>)。因为 Java 中缺少无符号的变量,所以需要这一运算符处理需要向右移位以在最高有效比特位中插入 1 这种情况。

C# 支持无符号变量,因此,C# 只需要标准的 >> 运算符。此运算符根据操作数是否有符号会产生不同的结果。将一个无符号数向右移位会在最高有效比特位中插入 0,而将一个有符号数向右移位会复制前面的最高有效比特位。

Checked 和 Unchecked 运算符

如果结果大小比分配给所用数据类型的位数大很多,算术运算将导致溢出。对给定的整数算术运算使用 checked 和 unchecked 关键字可以检查或忽略此类溢出。如果表达式是一个使用 checked 的常数表达式,就会在编译时产生错误。

下面这个简单的示例演示了这些运算符:

class TestCheckedAndUnchecked
{
    static void Main()
    {
        short a = 10000;
        short b = 10000;

        short c = (short)(a * b);                     // unchecked by default
        short d = unchecked((short)(10000 * 10000));  // unchecked
        short e = checked((short)(a * b));            // checked - run-time error

        System.Console.WriteLine(10000 * 10000);  // 100000000
        System.Console.WriteLine(c);              // -7936
        System.Console.WriteLine(d);              // -7936
        System.Console.WriteLine(e);              // no result
    }    
}

在这段代码中,unchecked 运算符绕过编译时错误,否则下列语句可能会导致编译时错误:

short d = unchecked((short)(10000 * 10000));  // unchecked

下面的表达式在默认情况下 unchecked,因此值溢出后无提示:

short c = (short)(a * b);                     // unchecked by default

我们可以在运行时使用 checked 运算符强制检查表达式是否发生溢出:

short e = checked((short)(a * b));            // checked - run-time error

将前两个值赋给 d 和 c,会在程序运行时无提示地溢出值 -7936,但是在尝试相乘以获取使用 checked() 的 e 的值时,此程序将引发 OverflowException

说明:

也可以通过使用命令行编译器开关 (/checked) 控制是否检查代码块的算术溢出,或直接在 Visual Studio 中基于每个项目进行控制。

请参见

概念

C# 编程指南

参考

C# 运算符

其他资源

C# 编程语言(针对 Java 开发人员)