当前位置: 首页 > 面试题库 >

为什么n +++ n有效而n ++++ n无效?

孟宏才
2023-03-14
问题内容

在Java中,表达式为:

n+++n

似乎等于:

n++ + n

尽管+n是有效的一元运算符,其优先级高于中的算术运算+n + n。因此,编译器似乎假设该运算符不能为一元运算符,并解析该表达式。

但是,表达式:

n++++n

即使存在以下唯一有效的解决方案,也不会编译:

n++ + +n

++n+n被指定为具有相同的优先级,那么为什么编译n+++n为支持算术+而解决看似模棱两可的问题,但为什么不这样做n++++n呢?


问题答案:

首先使用最大修改规则将文件标记化(转换为标记序列)-始终获得尽可能长的有效标记。您的文本将转换为以下顺序:

n ++ ++ n

这是无效的表达。

根据JLS§3.2:

3.2。词汇翻译

使用以下三个词法转换步骤,将原始Unicode字符流转换为标记序列:

  1. 将Unicode字符原始流中的Unicode转义(第3.3节)转换为相应的Unicode字符。\
    uxxxx格式的Unicode转义符,其中xxxx是十六进制值,表示编码为xxxx的UTF-16代码单元。此翻译步骤允许任何程序仅使用ASCII字符表示。

  2. 将步骤1产生的Unicode流转换为输入字符和行终止符流(第3.4节)。

3.
将步骤2产生的输入字符和行终止符流转换为一系列输入元素(§3.5),该元素在空格(§3.6)和注释(§3.7)之后被丢弃,由标记(§3.5)组成它们是句法语法(第2.3节)的结尾符号。

即使结果最终不能正确编写程序,而每个词汇翻译都可以使用,也要在每个步骤中使用最长的翻译。

(因此,输入字符a--b被标记为(§3.5)为a, --, b,即使标记化a, -, -, b可能是语法正确的程序的一部分,也不是任何语法正确的程序的一部分。)



 类似资料:
  • 问题内容: java.util.Random源代码的第294行说 为什么是这样? 问题答案: 该描述并不完全准确,因为0不是2的幂。更好的说法是 当n是2的幂或2的幂的负数或零时。 如果n是2的幂,则二进制中的n是单个1,后跟零。-n为2的补数是倒数+ 1,因此位排成一行 要了解其工作原理,请将二进制补码视为逆+ 1。 因为当您添加一个得到两个的补码时,您会一直进行到一个。 如果n不是2的幂,则结

  • 我对此好奇已有一段时间了。我可以忍受,但如果没有足够的注意,它总是会咬我,所以我决定把它贴在这里。假设以下示例(Numpy版本=1.8.2): 我不知道别人怎么想,但我觉得结果不一致。最后一行是列向量,而倒数第二行是行向量,它们应该有不同的维数——在线性代数中它们有!(第5行是另一个惊喜,但我暂时忽略它)。考虑第二个例子: 现在误差的维数为(n,n)。是的,在第二行中我应该使用(n,)而不是(n,

  • orderer-n-kafka-n 启动一个可扩展的服务,包括 zookeeper、若干个 fabric-order 和若干个 kafka 节点。 如,启动 3 个 order 节点和 5 个 kafka 节点。 $ docker-compose up -d zookeeper$ docker-compose up -d kafka$ docker-compose scale kafka=5$ d

  • 我不确定numpy中(N,)和(N,1)之间的区别。假设两者都是一些特征,它们具有相同的N维,并且都有一个样本。有什么区别?

  • \n

    描述 (Description) 字符\n匹配换行符。 例子 (Example) 以下示例显示了字符匹配的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CharactersDemo { private static final St

  • 问题内容: 我试图实施Miller- Rabin素数测试 ,并且对为什么中型数字(〜7位数字)花费如此长时间(> 20秒)感到困惑。我最终发现以下代码行是问题的根源: (其中,和都是相似的,但不相等的中号,是幂运算符,并且是模运算符) 然后,我尝试将其替换为以下内容: 相比之下,它几乎是瞬时的。 对于上下文,这是原始功能: 定时计算示例: 输出(与PyPy 1.9.0一起运行): 输出(在Pyth