我想知道为什么下面的代码会产生奇怪的结果,编译器不会显示任何错误或警告。这看起来像是一个非常有效的错误来源。
val a = 10 * 20 +
10 * 30
val b = 10 * 20
+ 10 * 30
val c = (
(10 * 20)
+ (10 * 30)
)
val d = (10 * 20)
+ (10 * 30)
println(a)
println(b)
println(c)
println(d)
输出是:
500
200
500
200
答案 0 :(得分:2)
Kotlin有可选的分号,它允许并鼓励源代码省略语句分隔符(即分号;
)。因此,编译器很难猜出你作为程序员实际上打算做什么:
val b = 10 * 20
+ 10 * 30
将编译为b = 500
的作业和导致300
的第二个语句,但永远不会被分配给任何内容(与d
相同)。您如何看待编译器知道第二行实际上是第一个表达式的一部分?它本身就是有效的。
此thread提供了更多详细信息。
答案 1 :(得分:2)
我看起来很幸运能够使用也具有一元版本+
的运算符。
问题在于Kotlin允许一种表达方式,实际上并没有这样做:
12345
我也可以:
- 12345
这只是一个负数。我也可以有正数:
+ 12345
所以在这种情况下:
val a = 20 +
30
我有一个表达式,因为+
需要另一个参数,可以在下一行找到。
但是这里有两个表达式
val a = 20
+ 30
变量a
的值为20
,第二个表达式将不执行任何操作。
但是没有*
的一元版本,所以这有效:
val a = 10 *
20
和a == 200
,这会产生编译错误:
val a = 10
* 20
Error:(397, 17) Kotlin: Expecting an element
添加分号不会改变任何内容,因为最后一个表达式仍然无效,并导致编译错误。
你可以随时使用括号:
val x = (10
+ 20)