2016-03-09 2 views
2

Я хотел бы высказать некоторые сомнения в отношении тернарного оператора в Java.Java тернарный оператор: поведение, подобное условному перемещению (сборка) по ART?

В Java это выглядит так: x = (c? A: b). Из того, что я читал и переживал, он, кажется, выполняется как ветвь if/else, что означает, что оценивается только один оператор (либо a, либо b, но никогда не оба). Я хотел бы знать, всегда ли это так.

В C он может быть скомпилирован в условные ходы, которые оценивают оба выражения a и b.

Чтобы быть точным, я хотел бы знать, верно ли это для Android-кода. Знание того, что байт-код Java фактически переведен на собственные инструкции при установке на устройствах с недавней ОС (см. Android Runtime(ART)). Есть ли риск, что после АРТ появляются условные движения?

Приведем пример. Базовый класс, который будет содержать:

//class content 

int victoriesA = 0; 
int nonVictoriesA = 0; 
int totalCalls = 0; 

//...class content 

public int getIncrementedCounter(int goalsA,int goalsB){ 
    totalCalls++; 
    return (goalsA > goalsB ? ++victoriesA : ++nonVictoriesA); 
} 

public boolean testOpertor(){ 
    return (totalCalls == victoriesA + nonVictoriesA); 
} 

Если getIncrementedCounter вызывается несколько раз во время выполнения программы, будет функция testOperator всегда возвращает истину? (Предполагается, что код работает на одном потоке)

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

ответ

3

Согласно Java Language Specification, chapter 15.25

Во время выполнения сначала вычисляется первое выражение операнда условного выражения. При необходимости в результате выполняется преобразование распаковки.

Полученное логическое значение затем используется для выбора либо второй или третье выражение операнда:

Если значение первого операнда истинно, то выбирается второе выражение операнда.

Если значение первого операнда ложно, то выбирается третье выражение операнда.

Соответствие спецификации языка будет означать только 1 выражение.

+0

Благодарим вас за ссылку. – Gordak

Смежные вопросы