Такая вот операция есть во многих языках. И в Си тоже:
(условие) ? (если истинно) : (если ложно)
С коротыхами все понятно. А вот длинные макаронины вы как предпочитаете записывать?
Вот ниже код и его тернарный эквивалент.
static unsigned int q_atol(const char *p, unsigned int def) {
if (p && *p) {
if (p[0] == '0') { // leading "0" : either hexadecimal, binary or octal number
if (p[1] == 'x') { // hexadecimal
if (ishex(p))
def = hex2uint32(p);
} else if (p[1] == 'b') {// binary
if (isbin(p))
def = binary2uint32(p);
}
else {
if (isoct(p))
def = octal2uint32(p); // octal
}
} else if (isnum(p)) // decimal number?
def = atol(p);
}
return def;
}
Перевод в трудночитаемое:
..return p && *p ? (p[0] == '0' ? (p[1] == 'x' ? (ishex(p) ? hex2uint32(p)
: def)
: (p[1] == 'b' ? (isbin(p) ? binary2uint32(p)
: def)
: (isoct(p) ? octal2uint32(p)
: def)))
: (isnum(p) ? atol(p)
: def))
: def;
Читаем слева направо, до знака вопроса.
Если прочитанное ложно, тогда взгляд свой двигаем вниз до первого двоеточия
Если дошли до конца строчки, то вот он и ответ, а если нет, то идем в п.1.
А вы как записываете длиннющие конструкции? Бывало такое, что глянув в свой же код годовалой давности вы предпочли стереть к черту этот “?” оператор и переписать все по-новой, потому, что разобраться уже нет никакой возможности?
А зачем макаронины в тернар пихать?
Есть какой-то выигрыш у if?
MMM
27.Январь.2025 08:04:15
3
vvb333007:
Бывало такое, что глянув в свой же код годовалой давности вы предпочли стереть к черту этот “?” оператор и переписать все по-новой, потому, что разобраться уже нет никакой возможности?
Чем вам так этот тернарный оператор глянулся?
Я вообще почти никогда его не использую, предпочитаю if даже для самых простых случаев
я использую, если код потом легко читается, а такие конструкции, как выше, почитаю за авнокод.
3 лайка
Я думаю, что с включенной оптимизацией, будет одинаковый код сгенерирован. Ну, кстати, надо проверить, чего там гццшный генератор выдает.
Ну, во-первых, он значением является, т.е. я могу написать что-то типа
A = (тернарный оператор).
С if такой фокус не прокатит
А уж тем более, если я константу инициализировать хочу какую-нибудь глобальную.
А во вторых…
Ну, про выгоды написано тут (можно уменьшить код, можно избавиться от временных переменных и т.п., там ):
Не знаю. Эстетически более привлекателен. Можно здоровенные кракозябры создавать, например
Или вот, например:
Вызвать мембер-функцию можно вот так вот: ( тернарный оператор ).field
(f() ? a : b).fn(g() ? c : d).field_name);
Эквивалент с if/else
if (f())
if (g())
x.fn(c.field_name);
else
x.fn(d.field_name);
else
if (g())
y.fn(c.field_name);
else
y.fn(d.field_name);
1 лайк
Да, да… Помню я - на перловке напишешь вот таких однострочников и на след.утро уже ничего понять не в силах.
1 лайк
А как по такой конструкции будет шагать отладчик? Скорее всего никак, да? Вот за это и не люблю подобное.
1 лайк
? : дурацкая выдумка прородителей Си, это и так чертовски краткий язык.
Wizard2022:
И дурацкий до ужаса.
помницца Вова Патришев (был такой в Фидо) называл его “американский народный язык программирования”.
Я обычно пишу так, чтобы код не вылезал за пределы экрана просмотра. И мне удобно искать ошибки, и другим удобно читать. Один хрен оптимизатор сделает свое черное дело.
Очень уж граблисто написано. Просто сразу, навскидку.
Бывают случаи, когда чисто синтаксически if
низзя и деваться некуда.
Э…а такое может быть? Есть же ключевое слово if else, Как оно может быть синтакисически неудобно?
Кратенько можете продемонстрировать?
BOOM
27.Январь.2025 18:03:15
19
Я такое только во всяких digitalWrite() использовал, сейчас что-то надобности нет. А вот когда делал «универсальный» (нафик он мне сдался?) код для ОК / ОА 7-сегментников - удобненько.))
Ну, например, см. моё пояснение №3 вот здесь: Расчет полей структуры на этапе компиляции - #5 от пользователя ЕвгенийП
Это именно пример, бывают и другие ситуации.
BOOM
27.Январь.2025 19:20:58
21
А если if else в одну строку записать?
Хотя да, не удобочитаемо получается))