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

В C ++ оператор?: Быстрее, чем if () ... еще заявления? Есть ли различия между ними в скомпилированном коде?

69
задан Thomas Padron-McCarthy 3 November 2015 в 06:28
поделиться

8 ответов

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

84
ответ дан 24 November 2019 в 13:35
поделиться

В CA тернарный оператор "?:" Доступен для построения условных выражений формы

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;

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

0
ответ дан 24 November 2019 в 13:35
поделиться

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

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

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

40
ответ дан 24 November 2019 в 13:35
поделиться

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

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

Выполнение этого оператора с if/else приведет к созданию совсем другого скомпилированного кода.


Обновление через 8 лет...

На самом деле, я думаю, что так было бы лучше:

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

(вообще-то, я почти уверен, что вы можете заменить "%d" в первой строке на "один")

15
ответ дан 24 November 2019 в 13:35
поделиться

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

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

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

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% конечно лучше. Я думаю, что исправлять, когда он глючит, также больно

0
ответ дан 24 November 2019 в 13:35
поделиться

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

0
ответ дан 24 November 2019 в 13:35
поделиться

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

-4
ответ дан 24 November 2019 в 13:35
поделиться

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

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

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

93
ответ дан 24 November 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: