И? Как Вы его запишете, если единственным оператором должен быть return
?
if
ветвит, но не возвращает никаких значений. Тернарный же возвращает значения. Поэтому нельзя написать return if ...
, а return <тернарный>
– сколько угодно.
И? Как Вы его запишете, если единственным оператором должен быть return
?
if
ветвит, но не возвращает никаких значений. Тернарный же возвращает значения. Поэтому нельзя написать return if ...
, а return <тернарный>
– сколько угодно.
if(…) return A; else return B;
Видать if - невычисляемый, а contexpr требует возможности вычисления выражения, а не исполнения алгоритма ветвления.
const unsigned int boot_address = TARGET == ESP32 ? 0x12345678 : 0x87654321;
int app_main (int, char **) {
...
"long jmp to boot_address"
...
}
Более того, тернарный оператор может быть и как R-value (т.е. значанием), так и L-value, т.е. “принимающей стороной”
class Class1 a;
class Class2 b;
int condition;
(condition ? a : b).init(); // Lvalue
...
int d = condition ? a.init() : b.init() // Rvalue
и какая строка более читаемая? 5 или 7?
Простите, ну Вы ведь понимаете, что это не то. Зачем упираться, когда всё уже ясно? Если это шутка, то не смешная.
Раберем первый вариант использования или почему так редко пишут.
condition ? - if condition==0 . Написание не влияет на код который получится после компиляции, а потенциальная ошибка того, что condition может принимать значение от 1 до 65534 может доставить уйму удовольствия при отладке. Не зря придуманы bool переменные. Это позволяет избежать на этапе компиляции кучи ошибок.
Различие первого и второго варианта - получение или отбрасывание результата, не более.
Вы попросите компилятор дать вам ассемблерный код - сразу поймете все.
Не шутка, я реально не вижу разницы в работе программы в обоих случаях. Возможно что-то не понял.
Ну, там же у меня написано:
Если Вы не понимаете по-русски, вот Вам оригинальный текст из стандарта:
Ничего другого там быть не может.
они не эквивалентны.
это просто иллюстрация того, что тернарный оператор может, грубо говоря, “стоять слева” и “стоять справа” от знака “=”
для меня, если честно, простая ?: операция проще для восприятия.
Запросите ассемблерный код. Зачем гадаете?
Будет что то типа
jz r1,l10001
…
jamp l10002
l10001:
…
l10002:
Смотрите, у вас простая задача: вам нужно проинициализировать константу
(глобальную, допустим) значением, которое зависит от каких-то начальных условий.
Ну, например:
#define USE_CELSIUS 1 // set to 0 to use F
...
const float Coefficient = USE_CELSIUS ? 1 : 2.3;
Или, C++ (не стоит искать практического применения написанному коду. он просто для иллюстрации)
...
(protocol_is_twowire ? new TwoWire() : new SPIClass(HSPI) )->begin();
...
Не спорю, дело вкуса.
Реально такие мелкие условия редко у меня встречаются, обычно после if идет куча всего, тут эти закорючки ? : только напрочь запутают ИМХО.
Клиент не понял ))
кто, я не понял?! всё я понял ахаха.
Я пишу так, чтобы КОНКРЕТНО Я потом как можно лучше понимал, что там и как работает. Эти закорючки меня путают, не привык я к ним и смыла привыкать пока не вижу, тк без них можно запросто обойтись в любом реальном случае.
Петрович привел вроде пример, когда нельзя
ага, только реально он нигде не понадобится, и/или это можно будет решить другим способом.
А наглядность? А лаконичность? Это же искусство!)))
#define CELSIUS 1
#define FAHRENHEIT 2.3
#define US
…
…
#ifdef US
const float Coefficient = 2.3
#else
const float Coefficient = 1
#endif
И не надо грузить процессор лишним.