Почему `variable ++` увеличивает переменную, а переменная + 1 нет? - PullRequest
0 голосов
/ 27 июня 2019

Вот проблема, с которой я столкнулся с этой проблемой:

Функция должна сравнивать значение в каждой позиции индекса и набирать балл, если значение для этой позиции выше.Нет смысла, если они одинаковы.Учитывая, что 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 ]

4 голосов
/ 27 июня 2019

То, что говорили другие, правда, но в Котлине есть еще кое-что.++ - это просто синтаксический сахар, и внутри этой переменной он будет вызывать inc().То же самое относится к --, что вызывает dec() (см. документация ).Другими словами, 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 
}

Объяснение этому приведено в документации, которую я связал выше:

Компилятор выполняет следующие шаги для разрешения оператора в постфиксе форма, например, a++:

  • Сохранить начальное значение a во временном хранилище a0;
  • Присвоить результат a.inc () a;
  • Возвращает a0 как результат выражения.

...

Для префиксов форм разрешение ++a и --a работает аналогичным образом, и эффектis:

  • Присвоить результат a.inc () a;
  • Вернуть новое значение a в результате выражения.
3 голосов
/ 27 июня 2019

Поскольку

variable++ является ярлыком для variable = variable + 1 (т.е. с назначением)

, а

variable + 1 является ярлыком для variable + 1 (т.е.без назначения и вообще не ярлык).

2 голосов
/ 27 июня 2019

Эквивалент a++ равен a = a + 1, вам нужно переназначить то же, что и оператор inc.

Это не связано с Kotlin, но есть вещь, которую вы найдете практически на любом другом языке

2 голосов
/ 27 июня 2019

Это потому, что обозначение a++ на самом деле a=a+1, а не просто a+1.Как видите, a+1 вернет значение, которое на единицу больше, чем a, но не перезапишет a.

Надеюсь, это поможет.Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...