为什么,在我的计算器程序中,
System.out.println("Answer is" + x-y);
给出了坏操作数的编译错误。它只对减法二元运算符-
执行,而不对任何其他二元运算符(+
,*
,/
)执行此操作?
即使正确的语法是
System.out.println("Answer is"+ (x <binary operator> y));
然而,除了减法二元运算符之外,所有语法也被编译并运行而不会产生错误。
答案 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 * 4
与2 + ( 3 * 4)
答案 2 :(得分:0)
对于Strings,plus运算符重载,并且您在同一行中执行字符串连接和数学运算。确保所需算术结果连接的唯一方法是用括号括起差异。
在此上下文中,运算符优先级从左到右发生,因此Java会认为您正在尝试对不受支持的String执行某些操作,因为它会将x
连接在一起形成{ {1}},然后尝试从该字符串中减去。
答案 3 :(得分:0)
其他运算符不提供编译错误的原因是运算符优先级
答案 4 :(得分:0)
字符串连接也是使用运算符重载+运算符完成的。 但是没有超载#34; - &#34;运营商。 首先评估优先级*和/,然后评估+,这样可以简化您的歧义