这是我在Internet上找到的一些代码:
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
++中工作。我仍然没有找到解决方案,因此,如果有人这样做,请在下面进行评论。
这里有一些不可见的字符,它们会改变代码的显示方式。在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
,这是一个从左到右的替代,开始一个嵌套块,其中所有字符被强制为从左到右的顺序,覆盖第一个替代。
Ergo在显示原始代码时class M
会正常显示,但是将\u202E
所有内容的显示顺序从那里\u202D
颠倒到,从而再次颠倒了一切。(通常,从\u202D
到行终止符的所有内容都会反转两次,一次是由于的缘故,一次是由于,\u202D
其余的文字由于的缘故而反转\u202E
,这就是为什么此文本显示在行的中间而不是结尾的原因。)由于行终止符,下一行的方向性与第一行的方向无关,因此{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}
可以正常显示。
有关完整(极其复杂,长数十页)的Unicode双向算法,请参见Unicode标准附件#9。
我得到这个问题在Leetcode:https://leetcode.com/problems/reverse-bits/ 所以输入将是一个十进制整数,我必须把它变成二进制32位。 然后我把它倒过来,回到小数点。 例如: 输入: 输出: 这是我的代码: 如果我运行此代码在Leetcode在线法官,我会得到这个错误: 此错误由输入0引发。 我不知道为什么会出现这个错误。我的代码似乎运行良好!
问题内容: 我似乎找不到解决此问题的方法。我正在做的是声明一个整数,它告诉我代码不可访问。 问题答案: 一旦使用方法,您将返回到首先调用该方法的方法。返回后放置的任何语句都是没有意义的,因为那是在不严重违反程序计数器的情况下无法到达的代码(在Java中可能是不可能的)。
问题内容: var x int done := false go func() { x = f(…); done = true } while done == false { } 这是Go代码。我的恶魔告诉我,这是UB代码。为什么? 问题答案: Go Memory Model不保证该程序将始终遵守在goroutine中写入x的值。go常规销毁 部分中提供了一个类似的错误程序作为示例。 在本节中,G
问题内容: 我编写了以下程序: 由于通道事件列表是一个缓冲通道,我想我应该获得100倍的输出“嘿!”,但是它只显示一次。我的错误在哪里? 问题答案: 更新(Go 1.2版或更高版本) 从Go 1.2开始,调度程序基于 抢先式多任务处理 原则。这意味着原始问题(以及下面提供的解决方案)中的问题不再相关。 从Go 1.2发行说明中 调度程序中的抢占 在以前的版本中,永远循环的goroutine可能会使
问题内容: 在方法或类范围内,下面的行进行编译(带有警告): 在类范围中, 变量获取其默认值 ,以下给出“未定义引用”错误: 它不是第一个应该以相同的“未定义参考”错误结束吗?还是第二行应该编译?还是我缺少什么? 问题答案: tl; dr 对于 字段 ,是非法的,因为它是对的非法前向引用。您实际上可以通过编写来解决此问题,该文件可以毫无抱怨地进行编译。 对于 局部变量 ,是非法的,因为未在使用前进