Kotlin正在忽略表达式

Kotlin正在忽略表达式,kotlin,Kotlin,我想知道为什么下面的代码生成奇怪的结果,而编译器没有显示任何错误或警告。这看起来是一个非常有效的bug来源 val a = 10 * 20 + 10 * 30 val b = 10 * 20 + 10 * 30 val c = ( (10 * 20) + (10 * 30) ) val d = (10 * 20) +

我想知道为什么下面的代码生成奇怪的结果,而编译器没有显示任何错误或警告。这看起来是一个非常有效的bug来源

    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

Kotlin有可选分号,它允许并鼓励源代码省略语句分隔符(即分号
)。因此,编译器很难猜测您作为程序员实际打算做什么:

val b = 10 * 20
       + 10 * 30
将被编译为赋值为
b=500
和第二条语句,该语句产生
300
,但从未被赋值到任何对象(与
d
相同)。如何考虑编译器知道第二行实际上是第一个表达式的一部分?它本身是有效的


这提供了更多的细节。

我似乎很幸运地使用了一个操作符,它也有一元版本
+
。 问题是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)

Java中不存在此问题,例如,由于您有一个强制分号,因此可选性会导致某些问题