используя + = и троичный оператор в java уточнение - PullRequest
2 голосов
/ 16 апреля 2020

Я пробежал несколько практических вопросов к предстоящему экзамену и натолкнулся на вопрос, который мне или моим одноклассникам может показаться понятным. Это выглядит следующим образом:

, где все переменные являются массивом int или int.

score + = (rounds [i])? i + START: 0

Как троичный оператор работает в java с + =? Это мое понимание:

так что это оценка + = round [i] == i + start или == 0.

Это правильное понимание?

Вид С уважением, Джеймс

Ответы [ 4 ]

3 голосов
/ 16 апреля 2020

Как и для любой комбинации операторов, это вопрос приоритета операторов и (где операторы имеют одинаковый приоритет) ассоциативности. В Java простое назначение и все операторы / операторы назначения имеют самый низкий уровень приоритета. Тернарный оператор является единственным обитателем следующего уровня с более высоким приоритетом. Следовательно, ваше выражение эквивалентно

score += ((rounds[i]) ? (i + START) : 0)

То есть вычисляется троичное выражение, а его результатом является правый операнд +=.

Как и другие наблюдали в Java это недопустимо, если тип rounds[i] равен int, хотя в C это было бы нормально. Но выражение могло бы быть разумным в Java, если бы rounds[i] был массивом boolean, или его можно было бы переписать следующим образом ...

score += ((rounds[i] != 0) ? (i + START) : 0)

... при условии, что * Булевская интерпретация целого числа в стиле 1020 * rounds[i] - это то, что нужно.

1 голос
/ 16 апреля 2020

Мы можем попробовать.

    int START = 3;

    int score = 0;
    boolean[] rounds = { true, false };
    for (int i = 0; i < rounds.length; i++) {
        score += (rounds[i]) ? i + START : 0;
        System.out.format("i is %d, score is %d%n", i, score);
    }

Вывод:

i is 0, score is 3
i is 1, score is 3

Так что первый раз через l oop i равен 0 и rounds[i] - это true. В этом случае Java добавляет i и START для получения 3 и добавляет это к score. Во второй раз i равен 1, а rounds[i] равен false, поэтому вместо него добавляется просто 0.

Запрос, о котором вы спрашиваете, добавляет значение к score. Добавленное значение равно i + START, если rounds[i] может быть оценено как true, и 0, если это false. Если i и START являются цифрами c, число будет добавлено. Если score равно цифре c, добавление 0 обычно не имеет значения, поэтому вы можете думать о выражении как о добавлении значения только в том случае, если rounds[i] является истинным.

, поэтому это оценка + = round [i] == i + start или == 0.

Нет, в выражении нет неявного == сравнения (как уже говорили другие, требуется, чтобы rounds[i] было логическое значение, true или false).

1 голос
/ 16 апреля 2020
score += (some condition which is true or false) ? value to add if true : value to add if false;
0 голосов
/ 16 апреля 2020

Тернарный оператор ?: используется следующим образом:

  • a = bolean_expression? это если true: иначе это если false.
        int start = 5;

        // In this case, start was added to itself to obtain 10.                
        start += true ? start  : 0;
        System.out.println(start); // prints 10

        // with out the compound assignment operator (+=) the
        // expression should be enclosed in () 
        start = start + (true ? start : 0);
        System.out.println(start); // prints 20

В вышеупомянутых случаях, если логическое значение было ложным, start всегда будет иметь значение 5, так как 0 будет добавлено каждый раз.

...