当前位置: 首页 > 知识库问答 >
问题:

这是Java编译器错误还是正确的语句?[副本]

越嘉茂
2023-03-14

几天前,我在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语法?

共有3个答案

谷梁驰
2023-03-14

这是正确的java语法。在java中,如果我们对一个字符应用一元运算符,那么它会将该字符转换为unicode值。像“a”一样,它会将其转换为97,因为字符“a”的unicode值是97。

所以在您的情况下strOut=“AA”cSEP“BB”;=“AA”'|'“BB”;

“|”,所以这个“|”将转换为它的unicode值,“|”的unicode值是124。

在字符串上,我们不能应用一元运算符,因此在这种情况下,strOut=“AA”sSEP“BB”;您遇到错误

刘建中
2023-03-14

这是正常的Java(表达式)语法。在表达式中:

"AA" + + cSep

第二个是一元运算符,它适用于(仅)数字类型。char类型是Java中的数字类型。

请注意,一元的优先级高于二进制,因此上述等价于:

"AA" + ( + cSep )

但表达方式是:

"AA" + + sSep

是非法的,因为未为String定义一元运算符。

但是“AA”cSep实际上是做什么的?

一元运算符执行一元数字提升,将字符转换为整数。在上下文中,它相当于:

"AA" + ((int) cSep)

这又相当于:

"AA" + Integer.toString((int) cSep)

这意味着AA后面将有一个十进制数字,而不是管道字符。

参考文献:

  • JLS 15.15.3一元加号运算符
  • JLS 15.18.1字符串连接运算符
  • JLS 5.6.1一元数字提升
牟嘉
2023-03-14

字符串和字符之间的差异非常显著。某些数字运算符应用于字符时,会将字符转换为整数(这称为一元数字提升)。另一方面,仅为字符串定义二进制运算符。

在代码的第二行和第三行,表达式的解析如下:

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,并且此过程应