Вопрос:

Скобки при использовании троичного оператора

java

503 просмотра

2 ответа

316 Репутация автора

Почему выходные данные отличаются для двух приведенных ниже случаев? Это было частью большой проблемы, которую я отладил и сузил до проблемы

public static void main(String[] args) {    

        String test = "hello";
        System.out.println(call() + test.charAt(0)=='h'?1:0);
    }

static int call()
    {
        return 1;
    }

Выход: 0

Но если я добавлю парантез, я получу ожидаемый результат

public static void main(String[] args) {    

        String test = "hello";
        System.out.println(call() + (test.charAt(0)=='h'?1:0));
    }

static int call()
    {
        return 1;
    }

Выход: 2 (как и ожидалось)

При первоначальном вызове оценивается ли call () + test.charAt (0) по отношению к 'h' и присваивается ли 1 и 0 соответственно? Что означает, что {1 + значение ascii 'h'} == 105 сравнивается со значением ascii 'h', которое составляет 104?

Автор: saltandwater Источник Размещён: 22.08.2016 09:49

Ответы (2)


2 плюса

24715 Репутация автора

Дело не в вашем троичном операторе, а в том, что +предшествует ==:

call() + test.charAt(0)=='h'?1:0

в любом чтении эквивалентно

(call() + test.charAt(0)) == 'h'?1:0

Кроме того, ==имеет более высокий приоритет ?, так что это равно

((call() + test.charAt(0)) == 'h') ? 1 : 0
Автор: Marcus Müller Размещён: 22.08.2016 09:51

4 плюса

22418 Репутация автора

Решение

На самом деле проблем нет, операторы имеют разный порядок приоритета.

Если вы проверите ссылку, которую Энди Тернер добавил в своем комментарии, вы найдете эту таблицу

введите описание изображения здесь

Как видите, additive( +и -) имеет более высокий приоритет над троичным оператором. Вот почему:

call() + test.charAt(0)=='h'?1:0
^^^^^^^^^^^^^^^^^^^^^^^
  High precedence      
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       Less precedence

Таким образом, вы можете изменить порядок приоритета, используя скобки:

call() + (test.charAt(0)=='h'?1:0)
          ^^^^^^^^^^^^^^^^^^^^^^^
              High precedence      
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       Less precedence
Автор: Federico Piazza Размещён: 22.08.2016 09:53
Вопросы из категории :
32x32