Можно ли заменить все конструкции if-else эквивалентным условным выражением с помощью условного оператора?
Нет, вы спрашивали об этом задом наперед. «Тела» if / else содержат операторы, и невозможно превратить каждый оператор в выражение , такое как операторы try, while, break, а также объявления. Однако многие «высказывания» действительно являются замаскированными выражениями:
++i;
blah = 42;
some_method(a,b,c);
Все это операторы, которые состоят из одного выражения (приращение, присваивание, вызов функции, соответственно) и могут быть превращены в выражения в условном выражении.
Итак, давайте перевернем вопрос, поскольку кажется, что вы действительно хотите знать, насколько эквивалентны операторы if / else троичным условным выражениям: Можно ли заменить каждое условное выражение эквивалентными операторами if / else? Почти все, да. Типичным примером являются операторы return:
return cond ? t : f;
// becomes:
if (cond) return t;
else return f;
Но также и другие выражения:
n = (cond ? t : f);
// becomes:
if (cond) n = t;
else n = f;
Который начинает указывать на то, что условные выражения не могут быть легко заменены: инициализации . Поскольку вы можете инициализировать объект только один раз, вы должны разбить инициализацию, использующую условное выражение, на использование явной временной переменной:
T obj (cond ? t : f);
// becomes:
SomeType temp;
if (cond) temp = t;
else temp = f;
T obj (temp);
Обратите внимание, что это гораздо более утомительно / громоздко и требует чего-то зависящего от типа, если SomeType не может быть создан и назначен по умолчанию.