В C++ оператор is: быстрее, чем if() ... else. Существуют ли различия между ними в скомпилированном коде?Тернарный оператор?: Vs if ... else
ответ
Зависит от вашего компилятора, но на любом современном компиляторе, как правило, нет разницы. Это то, о чем вам не стоит беспокоиться. Сосредоточьтесь на ремонтопригодности вашего кода.
+1 Для многих приложений разница в перфорации не стоит рассматривать даже на самом компиляторе дампа. – delnan
Что касается ремонтопригодности кода, я бы предпочел бы, если бы ... еще. По крайней мере, для меня это легче читать. – Exa
@Exa: зависит от контекста. Тройной оператор часто лучше, когда вы инициализируете объект. –
Нет, они преобразуются в один и тот же исполняемый код.
-1: В какой версии какого компилятора, на какой платформе, с каким кодом? – Puppy
DeadMG: компилятор VB6, очевидно! –
Это не быстрее. Существует одна разница, когда вы можете инициализировать постоянную переменную в зависимости от некоторого выражения:
const int x = (a<b) ? b : a;
Вы не можете сделать то же самое с if-else
.
Да, с инициализацией «if-else» с некоторым значением по умолчанию, а затем присваиванием нового значения. Прошло еще несколько циклов процессора. – 2010-08-25 11:39:29
@Developer Art: Это невозможно с переменной 'const'. – Job
Вы можете создать неконстантную переменную, назначить ей в if/else, а затем создать новую константную переменную и построить ее с неконстантной. Скорее расточительный, но далекий от невозможности. – Puppy
Они же, однако, тройной оператор может использоваться в местах, где трудно использовать, если/другое:
printf("Total: %d item%s", cnt, cnt != 1 ? "s" : "");
Делая это заявление с, если/иначе, будет генерировать очень другой скомпилированный код.
Даже не нужен тройной оператор: 'printf (" Total:% d item% s ", cnt," s "+ (cnt == 1));' – MSalters
@MSalters, но это дает двойной нуль при конец строки, что может быть проблемой в других ситуациях, когда двойной null означает что-то (например, в элементе 'lpStrFilter' [структуры OPENFILENAME] (http://msdn.microsoft.com/en-us/library/ms646839 (VS.85) .aspx)) – bobobobo
@bobobobo: Нет. '% S' печатает до, но не включает' \ 0' из исходной строки. – MSalters
Я видел, что GCC превратил условный оператор в инструкции cmov
(условное перемещение), а при повороте if
операторов в ветви, что означало в нашем случае, код был быстрее при использовании условного оператора. Но это было пару лет назад, и, скорее всего, сегодня оба будут компилироваться по одному и тому же коду.
Невозможно скомпилировать тот же код. Если вам нужна производительность, то, как всегда, мер. И когда вы измерили и узнали, что 1. ваш код слишком медленный, и 2. именно этот кусок кода является виновником, затем изучите код сборки, сгенерированный компилятором, и проверьте сами, что происходит.
Не доверяйте золотым правилам, например «компилятор всегда будет генерировать более эффективный код, если я использую условный оператор».
+1. Когда я разрабатывал PS3, используя GCC, использование условных выражений вместо «if» было полезно избежать ветвей. –
Это специфично для языка c? В стандарте C++ говорится: «Оценивается только одно из второго и третьего выражений. Каждое значение вычисление и побочный эффект, связанные с первым выражением, секвенируются перед вычислением каждого значения и побочным эффектом, связанным со вторым или третьим выражением. «Это, по-видимому, не позволяет компилятору генерировать команды cmove. – zoujyjs
@zoujyjs no, C имеет то же правило. Но в соответствии с правилом as-if компилятор может обманывать, если конечный результат верен. Таким образом, пока нет побочных эффектов, компилятор может сделать эту оптимизацию. – jalf
Теперь я не могу с этим поделать, я могу помочь с дополнительным вопросом под ним, хочу ли я его использовать? Если вы просто хотите узнать о скорости, просто игнорируйте мой комментарий.
Все, что я могу сказать, это быть очень умным, когда использовать тройной? : оператор. Это может быть благословением, а также проклятием для удобочитаемости.
Спросите себя, если вы найдете это легче читать, прежде чем использовать его
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% уверен, что это лучше. Это боль, чтобы исправить, когда она прослушивается, я думаю,
Первая строка должна, вероятно, читать 'int x = x == 1? 1: 2' или, возможно, 'int x = (x == 1)? 1: 2' – Hasturkun
Моя точка зрения состояла в том, чтобы просто показать вид кода, чистота одной строки - это хорошо. Но если вы хотите видеть CONDITION/ASSIGNEMENT, содержимое кода может быть фиктивным. Если вы хотите узнать, что вы смотрите на оператора и на место в одиночку. Я вижу слово IF и() Я знаю, ах, это условие. Я вижу A = B? СОСТОЯНИЕ: СОСТОЯНИЕ Вы сразу заметили это для себя? Большинство людей, которых я знаю, что программа не делает, может быть, это потому, что большинство людей, которых я знаю, это новички, подобные мне. Вы правы в цифрах, которые нонсенс, это точка. – Proclyon
Первая строка определенно нуждается в некоторых скобках. Возможно, «int x = (y == 1)? 0: 1;» или "int x = ((y == 1)? 0: 1);" – supercat
Я ожидал бы, что на большинстве компиляторов и целевых платформ будут случаи, когда «если» быстрее, а случаи где?: Быстрее.Будут также случаи, когда одна форма более или менее компактна, чем другая. Какие случаи относятся к одной форме или другой, будут различаться между компиляторами и платформами. Если вы пишете критически важный код на встроенном микропроцессе, посмотрите, что генерирует компилятор в каждом случае, и посмотрите, что лучше. На «мейнстримовом» ПК из-за проблем с кешированием единственный способ увидеть, что лучше, - это сопоставить обе формы с чем-то похожим на реальное приложение.
В тройном оператора CA ":" можно построить условные выражения вида
exp1 ? exp2:exp3
где exp1, ехр2 и 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;
** Следовательно, нет никакой разницы между этими двумя. Это просто для программиста, но для компилятора оба они одинаковы. *
Во время реверсирования некоторого кода (который я не помню, несколько лет назад) я видел разницу в одной строке между машинным кодом:? и if-else. Don't remember much but it is clear that implementation of both is different.
Но я советую вам не выбирать один из них b'coz своей эффективности, выбирать в соответствии с читабельностью кода или вашего удобства. Happy Code
Разница заключалась в том, что с помощью goto для ветвления использовалась goto, а другая использовала встроенную инструкцию saome, я не помню, какой из них использовал. –
Тернарный оператор всегда возвращает значение. Итак, в ситуации, когда вам нужно какое-то выходное значение из результата, и только 2 условия всегда лучше использовать тернарный оператор. Используйте if-else, если какое-либо из вышеупомянутых условий неверно.
Что это такое? Вы знаете, о чем говорите? – quantum
Просто быть немного левшой ...
x ? y : x = value
присвоит значение к у если х не 0 (ложь).
Я думаю, что есть ситуации, когда 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
Итак, встраивание КРП, мы экономим кучу операций, необходимых для держите a
живыми в том же объеме, что и b
. Хотя очень вероятно, что скорость оценки состояния довольно одинакова в обоих сценариях, изменение сферы действия заставляет вас учитывать другие факторы, что встроенный, если позволяет избежать.
А как насчет 'A a (true? 5: 10);' – Quest
Вы не обязаны поставить все это на одной линии: -
x = y==1 ?
2
:// else
3;
Это гораздо яснее, чем если/другое, потому что вы можете сразу увидеть, что обе ветви ведут к х быть назначены.
Независимо от скомпилированного кода, они семантически отличаются друг от друга. <cond>?<true expr>:<false expr>
- выражение, а if..else..
- это утверждение.
Хотя синтаксис условного выражения кажется неудобным, это хорошо. Вы вынуждены предоставить <false expr>
, и два выражения проверяются по типу.
Эквивалент if..else..
в функциональном языке, основанном на выражениях, например Lisp, Haskell равен ? :
в C++, а не if..else..
.
- 1. Тернарный оператор vs if else
- 2. Java тернарный оператор vs if/else in <совместимость JDK8
- 3. javascript тернарный оператор, противоположный if/else
- 4. Тернарный условный оператор для else if
- 5. Как я могу превратить инструкцию if-else в тернарный оператор?
- 6. Тернарный оператор против If/Else в Objective C
- 7. Как использовать тернарный оператор вместо if-else в PHP
- 8. Как преобразовать эти конкретные «if/else» блоки в тернарный оператор?
- 9. {{! $ Last && ',' || '.'}} это работает как тернарный оператор или условие if-else
- 10. Тернарный эквивалент обозначения If Else в C#
- 11. Тернарный оператор, если ... elsif ... else попытка Ruby
- 12. Вложенное if-else vs if-else?
- 13. Как добавить оператор if/else в этот оператор if/else?
- 14. Тернарный оператор
- 15. Оператор Oracle IF/ELSE
- 16. if-else vs if performance
- 17. Enum vs If-else
- 18. tryCatch() Vs if else
- 19. Переключатель vs if else
- 20. else if() {} VS ifelse()
- 21. Тернарный оператор в java vs c
- 22. if-if-else vs if-elif-else statement
- 23. Как включить инструкцию if-else с вложенным оператором if в один тернарный оператор?
- 24. Тернарный оператор
- 25. Оператор If-Else только выполняет else
- 26. if или/else else если оператор передается
- 27. Какой тернарный оператор использовать?
- 28. CASE vs IF-ELSE-IF vs GOTO keyword
- 29. ВЫБРАТЬ IF THEN ELSE оператор
- 30. Оператор if-else для images.setvisibilty
Трудный вопрос, так как это также зависит от настройки оптимализации компилятора. – extraneon
Это, безусловно, зависит от того, что вы делаете внутри ветвей. Условный оператор допускает только выражения, а 'if' допускает утверждения. – Gumbo
Относительно: [К тернарному или не к тернарному?] (Http://stackoverflow.com/questions/160218/to-ternary-or-not-to -ternary) –