【问题标题】:Java Multiple Consecutive OperatorsJava 多个连续运算符
【发布时间】:2014-09-30 20:33:44
【问题描述】:

注意:我有点偶然发现,所以可能不太实用,但我只是很好奇)

我想在增加第二个值之后打印出一个值,它是两个值的总和。像这样:

int first = 10;
int second = 20;
System.out.println(first + ++second);  //31
System.out.println(first);             //10
System.out.println(second);            //21

也许不是最简洁的代码,但它确实有效。但后来,我开始尝试。

System.out.println(first +++ second);  //30
System.out.println(first);             //11
System.out.println(second);            //21

没关系;这意味着第一个在添加后递增,并且此处的空格可以忽略。凉爽的。但是后来……

System.out.println(first +++++ second);  //"Invalid Argument", doesn't work

虽然

System.out.println(first ++ + ++ second);  //31
System.out.println(first);             //11
System.out.println(second);            //21

工作正常,但由于某种原因,仍然不同于

System.out.println(first + + + ++ second);  //31
System.out.println(first);             //10
System.out.println(second);            //21

也许是最奇怪的,

System.out.println(first + + + + + + second);  //30
System.out.println(first);             //10
System.out.println(second);            //20

那么这里发生了什么?什么时候忽略运算符之间的空格,什么时候不忽略?为什么我可以写“+ + + + +”,没有任何问题?

谢谢!

【问题讨论】:

  • 如果你继续做奇怪的事情,你所有的朋友都会讨厌你:(
  • 喜欢简单而不是好奇......
  • + ++三个不同的运算符。加法,前增量,后增量。
  • @Styl 呃,不!好奇心是优秀程序员的奇妙品质。我认为说“我永远不会在真正的代码中这样做,但我仍然对发生的事情感到好奇。”

标签: java operators


【解决方案1】:

这归结为operator precedence。操作顺序如下:

  • 后缀(foo++foo--
  • 一元(++foo--foo+expr,...)
  • ...
  • 添加剂 (+, -)
  • ...

那么,让我们来看看每个表达式:

first + ++secondfirst + (++second)。没关系。

first +++ second(first++) + second,正如你所说的那样。

first +++++ second((first ++)++)+ second),但 (first ++) 是一个值(不是变量),因此不能递增 - 这就是错误试图告诉您的内容。

first ++ + ++ second 明确告诉 Java 以不同于上面的方式拆分:它变成了 (first ++) + (++ second),这很好。

first + + + + + + second 变为 first + (+ (+ (+ (+ (+ second)))))。一元 + 只是意味着“不否定”,所以 +foo == foo。因此这个表达式简化为first + second,这显然没问题。

【讨论】:

  • 哦,一个正一元运算符。不知道存在。其他一切都有意义。干杯!
  • 那么,如果最后一个表达式的计算结果为 first + second,为什么 second 会增加 2? OP 声明 second 在最后一个表达式之后等于 22。
  • @bcsb1001 OP 一定在注释中写了错误的输出——它不会作为这个表达式的一部分增加。见gist.github.com/yshavit/c6a347b850bbc026e508
  • 是的,哎呀,我的错,我会为后代解决这个问题。
【解决方案2】:

我不想将其作为重复项关闭,因为它是一种不同的语言,但我相信这与here 的原因相同。

这只是一个解析问题,这些项目符号应该可以帮助您弄清楚:

  • Java 允许 大量 空格
  • + 这样的连续数学运算符没有额外的含义,只会应用一个
  • 从左到右进行解析

代码:first +++ second
解析:first++ + second

代码:first +++++ second
解析:没有二元运算符++,因为它会尝试使++ ++ +

代码:first ++ + ++ second
解析:first++ + ++second

代码:first + + + ++ second
解析:first + ++second

代码:first + + + + + + second
解析:first + second

【讨论】:

  • 感谢您的链接。我搜索了多个连续的运算符,但没有搜索“+++++”。
  • 我同意这是重复的,但遇到这种情况非常有趣。 ( ͡° ͜ʖ ͡°)
【解决方案3】:

我认为解析器是贪婪的,即它总是吃尽可能多的加号,以便尽可能将它们减少为增量运算符。

即它从左到右,当它发现两个后续加号时,它将它们评估为增量运算符,而单个加号后跟一个非加号被评估为二进制加号或一元加号,具体取决于左侧操作数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2019-05-31
    • 2016-09-21
    相关资源
    最近更新 更多