В C ++ оператор?: Быстрее, чем if () ... еще заявления? Есть ли различия между ними в скомпилированном коде?
Зависит от вашего компилятора, но на любом современном компиляторе вообще разницы нет. Это то, о чем вам не следует беспокоиться. Сконцентрируйтесь на ремонтопригодности вашего кода.
В 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;
** Следовательно, между этими двумя нет никакой разницы. Программисту будет легко написать это, но для компилятора и то, и другое одинаково. *
Я видел, как GCC превращал условный оператор в инструкции cmov
(условное перемещение), одновременно превращая операторы if
в ветви, что означало, что в нашем случае код был быстрее, когда с помощью условного оператора. Но это было пару лет назад, и, скорее всего, сегодня оба компилируются в один и тот же код.
Нет гарантии, что они будут компилироваться в один и тот же код. Если вам нужна производительность, как всегда, мера . И когда вы измерили и обнаружили, что 1. ваш код слишком медленный, и 2. именно этот фрагмент кода является виновником, изучите ассемблерный код, сгенерированный компилятором, и проверьте сами, что происходит.
Не верьте золотым правилам вроде «компилятор всегда будет генерировать более эффективный код, если я использую условный оператор».
Они одинаковы, однако тернарный оператор может использоваться в некоторых местах где трудно использовать 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" в первой строке на "один")
Теперь я не могу вам помочь с этим, я могу помочь с второстепенным вопросом под этим, хочу ли я его использовать? Если вы просто хотите узнать о скорости, просто проигнорируйте мой комментарий.
Все, что я могу сказать, это, пожалуйста, будьте очень умны в том, когда использовать тернарный ? : оператор. Это может быть как благословением, так и проклятием для удобочитаемости.
Спросите себя, не кажется ли вам, что это легче читать, прежде чем использовать его.
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% конечно лучше. Я думаю, что исправлять, когда он глючит, также больно
Я ожидаю, что на большинстве компиляторов и целевых платформ будут случаи, когда "if" будет быстрее, и случаи, когда ?: будет быстрее. Также будут случаи, когда одна форма более или менее компактна, чем другая. Какие случаи благоприятствуют той или иной форме, зависит от компилятора и платформы. Если вы пишете критически важный для производительности код на встроенном микроконтроллере, посмотрите, что компилятор генерирует в каждом случае, и посмотрите, что лучше. На «основном» ПК из-за проблем с кэшированием единственный способ увидеть, что лучше, — сравнить обе формы в чем-то, напоминающем реальное приложение.
Нет, они преобразуются в один и тот же исполняемый код.
Это не быстрее. Есть одно отличие, когда вы можете инициализировать константную переменную в зависимости от некоторого выражения:
const int x = (a<b) ? b : a;
Вы не можете сделать то же самое с if-else
.