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