科特林无视表达

时间:2018-02-28 16:21:48

标签: kotlin

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

    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

2 个答案:

答案 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)