Joshua Bloch 是Java语言组的设计师,去年离开Sun加盟Google,他的《Effective Java》一书在Java界影响很大。最近与Google的同事Neal Gafter (也是前Sun雇员) 合写了《Java Puzzlers: Traps, Pitfalls, and Corner Cases》。该书的几个条目以及全部Source Code可以在www.javapuzzlers.com下载到

我不想介入Java与C#间的比较,但还是不禁想比较一下里面的例子在C#里的行为。

下面是第二章里的几个例子的比较,是在.NET 2.0.50215 和Java 1.5.0下做的,至于结果为什么不一样,建议参考2门语言的Specifications。

1。奇偶性 

Java:

public static boolean isOdd(int i) {
        return i % 2 == 1;
    }

C#:
    public static bool isOdd(int i) {
        return i % 2 == 1;
    }

输出结果是一样的,这里涉及负整数的余数的问题,但输出结果也许跟你想的也许不一样


isOdd i=-2 i=-1 i=0 i=1 i=2 Java false false false true false C# False False False True False


2。浮点数的减法

Java: System.out.println(2.00 - 1.10);

C#: System.Console.WriteLine(2.00 - 1.10);

输出结果不一样


Java 0.8999999999999999 C# 0.9


对C#这个结果有点怀疑,大概是格式化的原因,因为如果用ILDASM看的话,是这样的

IL_0000:  ldc.r8     0.89999999999999991
  IL_0009:  call       void [mscorlib]System.Console::WriteLine(float64)

3。大整数除法

Java:
        final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
        final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;

System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);

C#:
        const long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
        const long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;

System.Console.WriteLine(MICROS_PER_DAY / MILLIS_PER_DAY);

在C#里编译出错,使用unchecked后输出相同,但输出结果也许跟你想象的输出结果不一样


Java 5 C# 5


4。16位数的加法

Java: System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));

C#:  System.Console.WriteLine("{0:x}", 0x100000000L + 0xcafebabe);

输出结果不一样


Java cafebabe C# 1cafebabe


5。多重转换

Java: System.out.println((int) (char) (byte) -1);

C#: 

unchecked
 {
         System.Console.WriteLine((int) (char) (byte) -1);
 }

输出结果不一样


Java 65535 C# 255


6。 整数交换

Java: 
        int x = 1984;
        int y = 2001;
        x \^= y \^= x \^= y;
        System.out.println("x = " + x + "; y = " + y);

C#:
        int x = 1984;
        int y = 2001;
        x \^= y \^= x \^= y;
        System.Console.WriteLine("x = " + x + "; y = " + y);

输出结果一样


Java x = 0; y = 1984 C# x = 0; y = 1984


7。条件运算符

Java:
        char x = 'X';
        int i = 0;
        System.out.print(true  ? x : 0);
        System.out.print(false ? i : x);

C#:
        char x = 'X';
        int i = 0;
        System.Console.Write(true  ? x : 0);
        System.Console.Write(false ? i : x);

输出结果不一样


Java X88 C# 8888