所以,我希望这不会编译,它不会:
// the two is inc'd, so reduces symbolically to println(int int)
// which is a compile error
System.out.println(1 ++ 2);
Run Code Online (Sandbox Code Playgroud)
但这样做:
System.out.println(1 + + 2); // returns three
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?不应该也不编译?
此外,由于操作员,这个问题很难搜索.
Sot*_*lis 41
从规范,词汇翻译
每个步骤都使用尽可能长的翻译,即使结果最终没有形成正确的程序而另一个词汇翻译也会如此.有一个例外:如果词汇翻译发生在类型上下文(§4.11)中,并且输入流有两个或多个连续的>字符后跟非>字符,则每个>字符必须转换为令牌以用于数值比较运算符>.
(也称为最大蒙克.)
它++被解释为后缀增量运算符,不能应用于整数文字,因此编译错误.
而
1 + + 2
Run Code Online (Sandbox Code Playgroud)
每个字符分别解释.1是一个整数文字,+是加法运算符,+是一元加运算符,2是一个整数文字.整个表达相当于
1 + (+2)
Run Code Online (Sandbox Code Playgroud)
这更容易阅读.
在Java/C++/C ++中不一样+ +.++/ --是递增/递减运算符.第一种情况不起作用,因为它不适用于文字(1或2).即便如此,它也不是一个有效的陈述,1++ 2也不1 ++2是Java中的有效陈述.第二个例子有效,因为它被解释为1 + (+2).Java词法分析器忽略了空格.以同样的方式这是有效的:
1 + + + 2 --> 1 + (+ (+2))
Run Code Online (Sandbox Code Playgroud)
要么
1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 2
Run Code Online (Sandbox Code Playgroud)
它的工作原理只是因为+是unary操作员.它不适用于字符串,如下所示:
"a" + + "b" // does not work because +"b" is not valid.
Run Code Online (Sandbox Code Playgroud)
同样,它与乘法无效
1 * * 2 // does not work because *2 is not valid.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2809 次 |
| 最近记录: |