为什么`variable ++`会增加变量,而`variable + 1'不会?

时间:2019-06-27 13:12:42

标签: kotlin

这是我遇到此问题的问题:

该函数应该比较每个索引位置的值,如果该位置的值较高,则得分。它们相同是没有意义的。给定a = [1, 1, 1] b = [1, 0, 0]的输出应为[2, 0]

fun compareArrays(a: Array<Int>, b: Array<Int>): Array<Int> {

    var aRetVal:Int = 0
    var bRetVal:Int = 0

    for(i in 0..2){
        when {
            a[i] > b[i] -> aRetVal + 1 // This does not add 1 to the variable
            b[i] > a[i] -> bRetVal++ // This does...
        }
    }
    return arrayOf(aRetVal, bRetVal)

}

IDE甚至说aRetVal未被修改,应声明为val

4 个答案:

答案 0 :(得分:4)

其他人说的是真的,但在Kotlin,还有更多。 ++只是语法糖,在幕后它会在该变量上调用inc()--同样适用,这导致dec()被调用(请参阅documentation)。换句话说,a++等效于a.inc()(对于Int或其他由编译器进行优化并在没有任何方法调用的情况下进行增量的原始类型)。

作为奖励,请考虑以下代码:

fun main() {
    var i = 0
    val x = when {
        i < 5 -> i++
        else -> -1
    }

    println(x) // prints 0
    println(i) // prints 1

    val y = when {
        i < 5 -> ++i
        else -> -1
    }

    println(y) // prints 2
    println(i) // prints 2 
}

对此的解释来自我上面链接的文档:

  

编译器执行以下步骤以 postfix 格式解析运算符,例如a++

     
      
  • 将a的初始值存储到临时存储a0中;
  •   
  • 将a.inc()的结果分配给a;
  •   
  • 作为表达式的结果返回a0。
  •   
     

...

     

对于前缀形式++a--a的解析方式相同,效果是:

     
      
  • 将a.inc()的结果分配给a;
  •   
  • 作为表达式的结果返回a的新值。
  •   

答案 1 :(得分:3)

因为

variable++variable = variable + 1的快捷方式(即已分配)

variable + 1variable + 1的“快捷方式”(即没有分配,实际上根本不是快捷方式)。

答案 2 :(得分:2)

这是因为符号a++实际上是a=a+1,而不仅仅是a+1。如您所见,a+1将返回一个比a大1的值,但不会覆盖a本身。

希望这会有所帮助。干杯!

答案 3 :(得分:2)

a++等效的是a = a + 1,您必须进行重新分配,而inc运算符也应执行此操作。

这与Kotlin无关,但是您会以几乎所有其他语言找到它