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 |