Тернарная условная операция

Такая вот операция есть во многих языках. И в Си тоже:

   (условие) ? (если истинно) : (если ложно)

С коротыхами все понятно. А вот длинные макаронины вы как предпочитаете записывать?

Вот ниже код и его тернарный эквивалент.

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. Читаем слева направо, до знака вопроса.
  2. Если прочитанное ложно, тогда взгляд свой двигаем вниз до первого двоеточия
  3. Если дошли до конца строчки, то вот он и ответ, а если нет, то идем в п.1.

А вы как записываете длиннющие конструкции? Бывало такое, что глянув в свой же код годовалой давности вы предпочли стереть к черту этот “?” оператор и переписать все по-новой, потому, что разобраться уже нет никакой возможности?

А зачем макаронины в тернар пихать?
Есть какой-то выигрыш у if?

Чем вам так этот тернарный оператор глянулся?

Я вообще почти никогда его не использую, предпочитаю if даже для самых простых случаев

я использую, если код потом легко читается, а такие конструкции, как выше, почитаю за авнокод.

3 лайка

Я думаю, что с включенной оптимизацией, будет одинаковый код сгенерирован. Ну, кстати, надо проверить, чего там гццшный генератор выдает.

Ну, во-первых, он значением является, т.е. я могу написать что-то типа

A = (тернарный оператор).

С if такой фокус не прокатит

А уж тем более, если я константу инициализировать хочу какую-нибудь глобальную.

А во вторых…
Ну, про выгоды написано тут (можно уменьшить код, можно избавиться от временных переменных и т.п., там ):

Не знаю. Эстетически более привлекателен. Можно здоровенные кракозябры создавать, например :slight_smile:

Или вот, например:

Вызвать мембер-функцию можно вот так вот: ( тернарный оператор ).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 лайк

? : дурацкая выдумка прородителей Си, это и так чертовски краткий язык.

И дурацкий до ужаса. Не только такими операторами, а ваще весь:smiley_cat::smiley_cat: по теме - никогда кракозябры не использовал и не собираюсь ибо смысла нет. :smiley_cat::christmas_tree::christmas_tree::christmas_tree:

помницца Вова Патришев (был такой в Фидо) называл его “американский народный язык программирования”.

Я обычно пишу так, чтобы код не вылезал за пределы экрана просмотра. И мне удобно искать ошибки, и другим удобно читать. Один хрен оптимизатор сделает свое черное дело.

Очень уж граблисто написано. Просто сразу, навскидку.

Бывают случаи, когда чисто синтаксически if низзя и деваться некуда.

Э…а такое может быть? Есть же ключевое слово if else, Как оно может быть синтакисически неудобно?
Кратенько можете продемонстрировать?

Я такое только во всяких digitalWrite() использовал, сейчас что-то надобности нет. А вот когда делал «универсальный» (нафик он мне сдался?) код для ОК / ОА 7-сегментников - удобненько.))

Ну, например, см. моё пояснение №3 вот здесь: Расчет полей структуры на этапе компиляции - #5 от пользователя ЕвгенийП

Это именно пример, бывают и другие ситуации.

А если if else в одну строку записать?
Хотя да, не удобочитаемо получается))