1、以下代码将打印出什么?
public class test1
{
public static void main(String args [])
{
// /u0022 is the Unicode escape for double quote(")
System.out.println("a/u0022.length() + /u0022b".length());
}
}
对该程序的一种很肤浅的分析会认为它应该打印 26,因为在两个双引号之间共有 26 个字符。稍微深入的分析会认为能打印 16 个,因为两个 Unicode 转义字符每一个在源文件中都需要 6 个字符来表示,但他们只表示字符串中的一个字符。但是事实上,它打印的既不是 26 也不是 16, 而是 2。
原因:Java 对在字符串字面常量中的 Unicode 转义字符没有提供任何特殊处理。编译器在将程序解析成各种符号之前,先将Unicode 转义字符转换成为它们所表示的字符。在该程序中,/u0022 表示的是 ", 因此,该程序可以解析为System.out.println("a".length() + "b".length()),这样就打印出了 2。
2、以下代码将打印什么?
/**
* Generated by the IBM IDL-to-Java compiler, version 1.0
* from F:/TestRoot/apps/units/include/PolicyHome.idl
* Wednesday, June 17, 1998 6:44:40 o'clock AM GMT+00:00
*/
public class test2
{
public static void main(String args [])
{
System.out.print("Hell");
System.out.println("o world");
}
}
这个题看起来相当简单,它应该打印 “Hello world”,但实际上,它根本无法通过编译。
原因:问题出在注释的第三行,它包含了字符 /units。这些字符以反斜杠(/)以及紧跟着的字母U 开头,而它(/U)表示的是一个Unicode 转义字符的开始。遗憾的是,这些字符后面没有紧跟四个十六进制的数字,因此,这个Unicode转义字符时病构的,而编译器被要求拒绝该程序。Unicode 转义字符必须是良构的,即使出现在注释中也是如此。
3、Java 和 C# 的比较
⑴ public class testJava
{
public static void Main ()
{
System.out.println("/u0022");
}
}
⑵ using System;
namespace tt
{
public class testNet
{
public static void Main ()
{
Console.WriteLine("/u0022");
}
}
}
以上两段代码分别是 java 和 c# 程序的代码,他们都要求输出字符串 /u0022, 在 java 中这样写将不能通过编译,而在 c# 中则打印出一个双引号(“).
原因:Java 对在字符串字面常量中的 Unicode 转义字符没有提供任何特殊处理。而在 c# 中将它转换成普通的字符来处理。若希望打印出 /u0022, 应该将反斜杠(/)进行转义,即(//u0022)。