C++, ассоциативность условного оператора

в этом коде:

finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass";

В книге говорится, что оператор ?: является правильным ассоциативным. Я сделал поиск в Интернете, поэтому я понимаю, что означает ассоциативность. Но я не могу понять, что это значит для приведенного выше кода. C++ начинается с чего? Эту операцию следует оставить ассоциативной, потому что она должна начинаться слева, выполняя первое условие, и продолжаться, выполняя второе условие, если необходимо, а не наоборот.


person gigi    schedule 08.01.2017    source источник
comment
Следует читать как (условие) ? (что делать, если правда) : (что делать, если ложь).   -  person Osman Mamun    schedule 08.01.2017
comment
рассмотрите объяснение в stackoverflow.com/ вопросы/7407273/   -  person Oleg Bogdanov    schedule 08.01.2017


Ответы (3)


Если бы ?: был оставлен ассоциативным, оператор

finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass";

будет рассматриваться как

finalgrade = ((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass";

который (в данном случае) не будет компилироваться, поскольку "high pass" и (grade < 60) имеют разные типы.

Поскольку на самом деле это правая ассоциативность, утверждение трактуется как

finalgrade = (grade > 90) ? "high pass" : ((grade < 60) ? "fail" : "pass");
person Peter    schedule 08.01.2017

Ассоциативность операторов не имеет ничего общего с тем, что выполняется первым. Если у вас есть оператор @, ассоциативность говорит вам,

a @ b @ c

следует читать как

(a @ b) @ c

or

a @ (b @ c)

В вашем случае ? ... : работает как правоассоциативный оператор:

(grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass"

разбирает как

(grade > 90) ? "high pass" : ((grade < 60) ? "fail" : "pass")

Другими словами, «else ветвь» первого ?: содержит еще один вложенный ?:.

(Если бы он оставался ассоциативным, он был бы

((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass"

, что не имеет большого смысла.)

person melpomene    schedule 08.01.2017
comment
Ассоциативность операторов не имеет ничего общего с тем, что выполняется первым. Но в (a @ b) @ c тогда наверняка сначала выполняется a @ b вместо b @ c ? - person artm; 08.01.2017
comment
@artm Рассмотрим (f() @ g()) @ h(). Вы не знаете, какая функция вызывается первой. Своим заявлением я имел в виду казнь a, b и c. - person melpomene; 08.01.2017
comment
@artm Даже тогда подумайте a && (b && c). В C++ b && c не может быть выполнено первым, потому что если a равно false, то первый && немедленно возвращает false. - person melpomene; 08.01.2017
comment
Я думаю, что без этого утверждения было бы понятнее. Мне нравится часть, которая просто объясняет, что означает левая (и правая) ассоциативность. - person artm; 08.01.2017

Это в значительной степени переводится как:

Моя итоговая оценка выше 90? Если так, то это считается высоким проходом. Или ниже 60? Если да, то это считается провалом. И затем, если результаты отличаются от выше 90 или ниже 60, это просто считается «проходным».

person 4Dimensions    schedule 08.01.2017