11.0 为什么运行此处代码后显示“ Hello World!”?| Java Debug 笔记

256 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:为什么运行此处代码后显示“ Hello World!”?

这是我在网上找到的一些代码:

class M‮{public static void main(String[]a‭){System.out.print(new char[]
{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}  

此代码打印Hello World!在屏幕上;我可以清楚地看到public static void main被写下来,但这是倒退的。此代码如何工作?怎么编译?

编辑:我在IntellIJ中尝试过此代码,并且工作正常。 但是,由于某些原因,它不能与cmd一起在notepad ++中工作。 我仍然没有找到解决方案,因此,如果有人这样做,请在以下注释一下。

回答1:

这里有一些不可见的字符,它们会改变代码的显示方式。 在Intellij中,可以通过将代码复制粘贴到空字符串(“”)中来找到它们,空字符串将它们替换为Unicode转义符,消除其影响并显示编译器看到的顺序。

这是该复制粘贴的输出:

"class M\u202E{public static void main(String[]a\u202D){System.out.print(new char[]\n"+
        "{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}   "

源代码字符按此顺序存储,并且编译器将其视为按此顺序存储,但是它们的显示方式有所不同。

请注意,\ u202E字符是从右到左的替代,开始一个块,其中所有字符都被强制从右向左显示,而\ u202D字符,是从左到右的替代,开始一个嵌套的块,其中所有字符都被强制从左到右排列,从而覆盖第一个覆盖。

如此,当它显示原始代码时,将正常显示M类,但是\ u202E会将所有内容的显示顺序颠倒过来,再到\ u202D,从而再次颠倒所有内容。 (通常,从\ u202D到行终止符的所有内容都会两次反转,一次是由于\ u202D造成的,一次是由于\ u202E导致文本的其余部分都发生了反转,这就是为什么此文本显示在行中间的原因由于行终止符,下一行的方向性与第一行的方向无关,因此{'H','e','l','l','o','','W' ,'o','r','l','d','!'});}}正常显示。