为什么只为减法二元运算符生成此错误?

时间:2016-02-17 15:23:48

标签: java

为什么,在我的计算器程序中,

System.out.println("Answer is" + x-y);

给出了坏操作数的编译错误。它只对减法二元运算符-执行,而不对任何其他二元运算符(+*/)执行此操作?

即使正确的语法是

System.out.println("Answer is"+ (x <binary operator> y));

然而,除了减法二元运算符之外,所有语法也被编译并运行而不会产生错误。

5 个答案:

答案 0 :(得分:3)

"System.out.println("Answer is" + x - y);"会出现编译错误,因为您尝试从y中减去String,其值为“答案为x”。

原因是操作符从左到右执行,第一个x附加到"Answer is",然后-运算符发生。由于减法不是String文字上的有效操作,因此错误会增加。

使用大括号(x - y)包装数值运算,表达式具有更高的优先级,并在字符串连接发生之前进行评估。

请注意,在使用/*运算符进行测试时,编译错误不会增加,因为有两个运算符的优先级高于+运算符,并且之前将应用它

答案 1 :(得分:3)

System.out.println("Answer is" + x-y);

通过在x末尾添加"Answer is"来生成字符串。 而且你不能从字符串中减去。

如果您x + y它将是相同的。但是将值添加到字符串的末尾是一个有效的操作。

为什么*/有效: 非常简单:它们优先于+-

类似2 + 3 * 42 + ( 3 * 4)

相同

答案 2 :(得分:0)

对于Strings,plus运算符重载,并且您在同一行中执行字符串连接和数学运算。确保所需算术结果连接的唯一方法是用括号括起差异。

在此上下文中,运算符优先级从左到右发生,因此Java会认为您正在尝试对不受支持的String执行某些操作,因为它会将x连接在一起形成{ {1}},然后尝试从该字符串中减去。

答案 3 :(得分:0)

其他运算符不提供编译错误的原因是运算符优先级

答案 4 :(得分:0)

字符串连接也是使用运算符重载+运算符完成的。 但是没有超载#34; - &#34;运营商。 首先评估优先级*和/,然后评估+,这样可以简化您的歧义