У C ++ оператор?: Швидший, ніж оператори if () ... else? Чи є між ними відмінності у складеному коді?
if
дозволяє оператори.
У C ++ оператор?: Швидший, ніж оператори if () ... else? Чи є між ними відмінності у складеному коді?
if
дозволяє оператори.
Відповіді:
Залежить від вашого компілятора, але від будь-якого сучасного компілятора, як правило, немає різниці. Це те, про що вам не варто турбуватися. Зосередьтеся на ремонтопридатності коду.
Це не швидше. Є одна різниця, коли ви можете ініціалізувати константу змінної залежно від якогось виразу:
const int x = (a<b) ? b : a;
Ви не можете зробити те ж саме з if-else
.
const
змінної.
max
? const int x = max(a,b);
працює просто чудово.
max ? const int x = max(a,b);
і подумав що! WTF - це! тоді я прочитав це ще раз і помітив, що знак запитання не є монопростором! зважаючи на тему, я думаю, що мені було виправдано думати? був частиною команди! :)
const int x = [&] -> int { if (a < b) return b; else return a; }
.
Я бачив, як GCC перетворює умовний оператор на cmov
інструкції (умовного переміщення), а перетворюючи if
оператори на гілки, що означало, що в нашому випадку код був швидшим при використанні умовного оператора. Але це було пару років тому, і, швидше за все, сьогодні, обидва вони компілювалися б до одного коду.
Немає гарантії, що вони скомпілюються до того самого коду. Якщо вам потрібна продуктивність, тоді, як завжди, виміряйте . І коли ви виміряли і виявили, що 1. ваш код занадто повільний, і 2. саме цей шматок коду є винуватцем, тоді вивчіть код збірки, сформований компілятором, і перевірте самі, що відбувається.
Не довіряйте золотим правилам на кшталт "компілятор завжди генеруватиме більш ефективний код, якщо я використовую умовний оператор".
Only one of the second and third expressions is evaluated. Every value computation and side effect associated with the first expression is sequenced before every value computation and side effect associated with the second or third expression.
що, мабуть, заважає компілятору генерувати cmove
інструкції.
Вони однакові, однак, тернарний оператор можна використовувати в місцях, де важко використовувати 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" у першому рядку на "one")
printf("Total: %d item%s", cnt, "s" + (cnt==1));
lpStrFilter
члені структур OPENFILENAME )
%s
друкує до, але не включаючи \0
з вихідного рядка.
printf("Total: %d item%s", cnt, "s" + (cnt==1));
працює?
(cnt==1)
true або false, що перетворюється на 0 або 1. "s" - це вказівник на рядок, що закінчується нулем. Додавання одного пропускає один символ (символи). Отже, друкується або "s", або "".
Тільки щоб бути трохи лівшею ...
x ? y : x = value
присвоїть значення , щоб у , якщо х НЕ дорівнює 0 (брехня).
Незалежно від складеного коду, вони семантично різні речі. <cond>?<true expr>:<false expr>
є виразом і if..else..
є твердженням.
Хоча синтаксис умовного виразу здається незграбним, це добре. Ви змушені вказати a, <false expr>
і два вирази перевіряються типом.
Еквівалент if..else..
у функціональній мові на основі виразів, як Lisp, Haskell знаходиться ? :
на C ++, а не на if..else..
операторі.
Я би очікував, що на більшості компіляторів та цільових платформ будуть випадки, коли "якщо" швидше, а випадки, де?: Швидше. Будуть також випадки, коли одна форма є більш-менш компактною, ніж інша. Які випадки надають перевагу тій чи іншій формі, залежать від компіляторів та платформ. Якщо ви пишете критичний для продуктивності код на вбудованому мікро, подивіться, що створює компілятор у кожному випадку, і подивіться, що краще. На "звичайному" ПК через проблеми з кешуванням єдиним способом побачити, що краще, є порівняння обох форм у щось, що нагадує реальний додаток.
У 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;
** Отже, між ними немає різниці. Це для програміста легко писати, але для компілятора обидва однакові. *
Під час реверсування деякого коду (чого я не пам’ятаю кілька років тому) я побачив різницю між рядками машинного коду: а якщо-ще.
Don't remember much but it is clear that implementation of both is different.
Але я раджу Вам не вибирати одного з них, оскільки він ефективний, вибирайте відповідно до зручності читання коду. Щасливого кодування
Тернарний оператор завжди повертає значення. Отже, у ситуації, коли вам потрібне якесь вихідне значення з результату, і є лише 2 умови, завжди краще використовувати тернарний оператор. Використовуйте if-else, якщо будь-яка з вищезазначених умов не відповідає дійсності.
Я думаю, що бувають ситуації, коли вбудований 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
. Хоча дуже ймовірно, що швидкість оцінки стану є досить рівною в обох сценаріях, зміна обсягу змушує вас брати до уваги інші фактори, що вбудований дозволяє вам уникати.
A a(true ? 5 : 10);
Зараз я не можу вам у цьому допомогти, можливо, я зможу допомогти з другорядним запитанням під ним, чи хочу я його використовувати? Якщо ви просто хочете знати про швидкість, просто проігноруйте мій коментар.
Все, що я можу сказати, це будь-ласка, будьте дуже розумні, коли використовувати тернар? : оператор. Це може бути як благом, так і прокляттям для читабельності.
Запитайте себе, чи вам це легше читати перед використанням
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
x = x = 1;
скрізь, а потім скаржитися, що призначення занадто складне і його слід уникати.