2014-11-14 92 views
-6

我有这样的代码,= - 运营商在java中

class Test 
{ 
    public static void main(String args[]) 
    { 
    int a=--4-2*2/9-3;//Line 1 
    System.out.println(a); 
    } 
} 

这是为什么在编译时间--4错误?请不要建议我有 - ( - 4)。我只是想弄清楚,为什么上面的代码是一个编译时错误,并且如果我将代码在第1行更改为,a = - -4-2 * 2/9-3,则O/p为1. ie - (-4)。我错过了一秒钟,它必须与 - =即a = a-(表达式的其余部分)相同。它也会给++运算符带来同样的错误!任何人都可以解释我吗?

+2

你希望做什么? – squiguy 2014-11-14 20:32:20

+1

当你有错误/异常时,**始终总是**发布错误和发生的地方。不要浪费每个人的时间,让我们坐在这里猜猜! – tnw 2014-11-14 20:33:14

+2

没有'= -'运算符。 – Jesper 2014-11-14 20:39:11

回答

2

--是Java和许多其他语言中的“递减”运算符。编译器不把它当作两个-运算符的原因是,有一条基本规则,编译器将查找形成here定义的其中一个“分隔符”或“运算符”的最长连续字符序列。 (>字符是因为仿制药的处理方式稍有不同)

JLS 3.2明确指出:

最长可能的翻译在每个步骤中使用,即使 结果最终并没有做出正确的程序,而另一个 词法翻译会。有一个例外[用于>字符] ...

因此,当编译器看到--4,它会将其作为施加到一个4--运营商,这是非法的。它不会回溯并尝试找到解释--的其他方法。

但是如果它看到- -4,连字符之间有一个空格,它不能将-解释为除个别减号外的其他任何内容。这是合法的,并且与-(-4)具有相同的含义。

8

问题是你正试图减少一个常量。例如,--var。如果扩大与不变(4)它看起来像

​​

符号而这是没有意义的

var = var - 1; 

什么是 “发生” 的模样。

+1

当心前缀和后缀如何工作,OP:http://stackoverflow.com/questions/5413548/java-prefix-postfix-of-increment-decrement-operators – tnw 2014-11-14 20:34:33

1

您不能在常数值(如4)上使用预先减量运算符“--运算符”。你只能在变量上使用它。

2

阅读说明书:15.15.2. Prefix Decrement Operator --

一元表达式前面有一个 - 操作者是一个前缀递减表达式。

一元表达式的结果必须是这样的类型 即转换(§5.1.8),以数字类型,或编译时发生错误 的可变

+0

对不起,我总是有理解JLS文档的问题。它是--4不是一个可转换类型变量? – Gpar 2014-11-14 21:06:49

+1

4不是一个变量 - 它是常数,或者是“literal”,因为它们在规范中命名。想一会儿......'while( - 4 <0){doSomething(); },这个循环是否有意义?我如何减少一个常量? – krokodilko 2014-11-14 22:45:16

+0

OH !!!我现在得到你,谢谢。 – Gpar 2014-11-14 23:11:46