Тернарный оператор?: Vs if... else

В С++ оператор?: быстрее, чем if()... else. Существуют ли различия между ними в скомпилированном коде?

Ответ 1

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

Ответ 2

Это не быстрее. Существует одна разница, когда вы можете инициализировать постоянную переменную в зависимости от некоторого выражения:

const int x = (a<b) ? b : a;

Вы не можете сделать то же самое с if-else.

Ответ 3

Я видел, что GCC превращает условный оператор в инструкции cmov (условное перемещение), а при преобразовании операторов if в ветки, что означало в нашем случае, код был быстрее при использовании условного оператора. Но это было пару лет назад, и, скорее всего, сегодня оба будут компилироваться по одному и тому же коду.

Там нет гарантии, что они будут компилироваться по одному и тому же коду. Если вам нужна производительность, то, как всегда, измерьте. И когда вы измерили и узнали, что 1. ваш код слишком медленный, и 2. именно этот кусок кода является виновником, затем изучите код сборки, сгенерированный компилятором, и проверьте сами, что происходит.

Не доверяйте золотым правилам вроде "компилятор всегда будет генерировать более эффективный код, если я использую условный оператор".

Ответ 4

Они одинаковы, однако тернарный оператор может использоваться в тех местах, где трудно использовать if if else:

printf("Total: %d item%s", cnt, cnt != 1 ? "s" : "");

Выполнение этой инструкции с if/else приведет к генерации очень другого скомпилированного кода.

Ответ 5

Просто чтобы быть немного левым...

x ? y : x = value

присваивает значение y, если x не равно 0 (false).

Ответ 6

Независимо от скомпилированного кода, они семантически разные вещи. <cond>?<true expr>:<false expr> - выражение, а if..else.. - утверждение.

Хотя синтаксис условного выражения кажется неудобным, это хорошо. Вы вынуждены предоставить <false expr>, и два выражения проверяются по типу.

Эквивалентно if..else.. в функциональном языке на основе выражения, таком как Lisp, Haskell ? : в С++ вместо оператора if..else...

Ответ 7

Теперь я не могу с этим поделать, я могу помочь с второстепенным вопросом под ним, хочу ли я его использовать? Если вы просто хотите узнать о скорости, просто игнорируйте мой комментарий.

Все, что я могу сказать, это быть очень умным, когда использовать троицу?: оператор. Это может быть благословением, а также бичем для удобочитаемости.

Спросите себя, находите ли вы это проще для чтения, прежде чем использовать его

int x = x == 1 ? x = 1 : x = 1;

if (x == 1)
{
   x = 1
}
else
{
   x = 2
}

if (x == 1)
    x = 1
else
    x = 1

Да Это выглядит глупо, чтобы сделать код на 100% фиктивным. Но этот небольшой трюк помог мне проанализировать мою читаемость кода. Это читаемость оператора, на который вы смотрите в этом примере, а не на контент.

Он СМОТРЕТЬ чистым, но также среднее сиденье для унитаза и дверная ручка

По моему опыту, который ограничен, я видел очень мало людей, которые действительно могли быстро выдавать информацию, требуемую от тройного оператора, избегать, если только 100% не уверены в этом. Это боль, чтобы исправить, когда она прослушивается, я думаю,

Ответ 8

Я бы ожидал, что на большинстве компиляторов и целевых платформ будут случаи, когда "if" быстрее, а случаи где?: быстрее. Будут также случаи, когда одна форма более или менее компактна, чем другая. Какие случаи относятся к одной форме или другой, будут различаться между компиляторами и платформами. Если вы пишете критически важный код на встроенном микропроцессе, посмотрите, что генерирует компилятор в каждом случае, и посмотрите, что лучше. На "мейнстримовом" ПК из-за проблем с кешированием единственный способ увидеть, что лучше, - это сопоставить обе формы в чем-то, напоминающем реальное приложение.

Ответ 9

Во время реверсирования некоторого кода (который я не помню, несколько лет назад) я видел разницу в одной строке между машинным кодом:? и if-else. Don't remember much but it is clear that implementation of both is different.

Но я советую вам не выбирать один из них b'coz своей эффективности, выбирать в соответствии с читабельностью кода или вашего удобства. Счастливое кодирование

Ответ 10

Тернарный оператор всегда возвращает значение. Поэтому в ситуации, когда вам нужно какое-то выходное значение из результата, и только два условия всегда лучше использовать тернарный оператор. Используйте if-else, если какое-либо из вышеупомянутых условий не соответствует действительности.

Ответ 11

Я думаю, что есть ситуации, когда inline if может получить "более быстрый" код из-за области, в которой он работает. Создание и уничтожение объектов может быть дорогостоящим, поэтому рассмотрим следующий сценарий:

class A{
    public:
    A() : value(0) {
        cout << "Default ctor" << endl;
    }
    A(int myInt) : value(myInt)
    {
        cout << "Overloaded ctor" << endl;
    }

    A& operator=(const A& other){
        cout << "= operator" << endl;
        value = other.value; 
    }

    ~A(){
        cout << "destroyed" << std::endl;
    }

    int value;

};


int main()
{
   {
       A a;
       if(true){
           a = A(5);
       }else{
           a = A(10);
       }
   }

   cout << "Next test" << endl;
   {
        A b = true? A(5) : A(10);
   }
   return 0;
}

С помощью этого кода вывод будет:

Default ctor                                                                                                                                                                                                                      
Overloaded ctor                                                                                                                                                                                                                   
= operator                                                                                                                                                                                                                        
destroyed                                                                                                                                                                                                                         
destroyed                                                                                                                                                                                                                         
Next test                                                                                                                                                                                                                         
Overloaded ctor                                                                                                                                                                                                                   
destroyed  

Таким образом, вставив if, мы сохраним кучу операций, необходимых для поддержания a живого в той же области, что и b. Хотя очень вероятно, что скорость оценки состояния довольно одинакова в обоих сценариях, изменение сферы действия заставляет вас учитывать другие факторы, что встроенный, если позволяет избежать.

Ответ 12

Вы не должны ставить все на одной строке: -

x = y==1 ?
    2
    :// else
    3;

Это намного яснее, чем if/else, потому что вы можете сразу увидеть, что обе ветки приводят к назначению x.

Ответ 13

В C Тернарный оператор "?:" доступен для построения условных выражений вида

exp1 ? exp2:exp3

где exp1, exp2 и exp3 - выражения

для примера

        a=20;
        b=25;
        x=(a>b)?a:b;

        in the above example x value will be assigned to b;

Это можно записать с помощью инструкции if..else, как показано ниже

            if (a>b)
             x=a;
             else
             x=b;

** Следовательно, нет никакой разницы между этими двумя. Это для программиста, чтобы писать легко, но для компилятора оба они одинаковы. *

Ответ 14

Нет, они преобразуются в один и тот же исполняемый код.