几天前,我在java代码中输入了一个错误,但它编译后运行良好。(尽管结果很奇怪。)
我的代码是:
public static void main(String args[]) {
String strOut;
char cSEP = '|';
String sSEP = "|";
strOut = "AA" + cSEP + "BB"; // Correct assignment
System.out.println(strOut); // The result is "AA|BB". This is OK.
strOut = "AA" + + cSEP + "BB"; // No Error : no token between two +
System.out.println(strOut); // The result is "AA124BB"
strOut = "AA" + + sSEP + "BB"; // This is compiler error !!!
System.out.println(strOut);
}
我无法找到为什么第二个作业没有错误,并且打印了124。(当然,“|”在ASCII码中是124。但为什么是“124”,而不是“|”?)
这是编译器错误吗?还是我还不知道的正确java语法?
这是正确的java语法。在java中,如果我们对一个字符应用一元运算符,那么它会将该字符转换为unicode值。像“a”一样,它会将其转换为97,因为字符“a”的unicode值是97。
所以在您的情况下strOut=“AA”cSEP“BB”;=“AA”'|'“BB”;
“|”,所以这个“|”将转换为它的unicode值,“|”的unicode值是124。
在字符串上,我们不能应用一元运算符,因此在这种情况下,strOut=“AA”sSEP“BB”;您遇到错误
这是正常的Java(表达式)语法。在表达式中:
"AA" + + cSep
第二个是一元
运算符,它适用于(仅)数字类型。
char
类型是Java中的数字类型。
请注意,一元的优先级高于二进制
,因此上述等价于:
"AA" + ( + cSep )
但表达方式是:
"AA" + + sSep
是非法的,因为未为String
定义一元运算符。
但是“AA”cSep
实际上是做什么的?
一元运算符执行一元数字提升,将字符转换为整数。在上下文中,它相当于:
"AA" + ((int) cSep)
这又相当于:
"AA" + Integer.toString((int) cSep)
这意味着AA后面将有一个十进制数字,而不是管道字符。
参考文献:
字符串和字符之间的差异非常显著。某些数字运算符应用于字符时,会将字符转换为整数(这称为一元数字提升)。另一方面,仅为字符串定义二进制运算符。
在代码的第二行和第三行,表达式的解析如下:
strOut = "AA" + (+ cSEP) + "BB";
一元运算符应用于字符时,通过一元数字提升将整个表达式转换为int。该值等于字符的编码值。因此表达式变为:
strOut = "AA" + 124 + "BB";
这是有效的。
但是如果cSEP
要替换为sSEP
:
strOut = "AA" + (+ sSEP) + "BB";
Java编译器不知道sSEP是什么意思。没有为字符串定义一元运算符!
问题内容: 过去,我使用C 作为编程语言。我知道用C 编写的代码会经过编译过程,直到成为目标代码“机器代码”为止。 我想知道Java在这方面如何工作。用户编写的Java代码如何由计算机运行? 问题答案: Java实现通常使用两步编译过程。Java编译器将Java源代码编译为字节码。字节码由Java虚拟机(JVM)执行。现代JVM使用称为即时(JIT)编译的技术将字节码编译为硬件CPU在运行时即时理
所以我得到了一个编译器错误,我丢失了一个返回语句,我已经研究了其他类似的问题,但我仍然对这个问题感到困惑。 如果之前有人问过这个问题,我会提前道歉,但我已经看过了其他各种问题,我似乎无法弄清楚这一点。
每次我整理这个的时候 这是输出 有人知道为什么吗?
问题内容: 我对JVM有一个非常基本的问题:它是编译器还是解释器? 如果它是解释器,那么JVM内部存在的JIT编译器怎么办? 如果两者都不是,那么JVM到底是什么?(我不希望将字节码转换为机器特定的代码等jVM的基本定义。) 问题答案: 首先,让我们对以下术语有一个清晰的认识 是Java编译器-将Java代码编译为 Bytecode 是Java虚拟机-运行/解释/将字节码转换为本 机代码 是即时编
问题内容: PHP是编译还是解释? 问题答案: PHP是一种解释型语言。可以解释PHP的二进制文件已编译,但是您编写的文件却被解释。
问题内容: 我注意到了一些意外的行为(相对于我的个人期望而言是意外的),我想知道是否是JVM中存在错误,或者这可能是一种边缘情况,在这种情况下我不了解某些确切的细节应该发生。假设我们自己在main方法中具有以下代码: 天真的期望是这样会印刷,最大的甚至可以代表。但是,我认为整数算术应该在Java中“翻转”,因此将1加到会导致。由于仍小于,因此循环将循环遍历负数甚至整数。最终它将回到0,并且此过程应