Я вважаю, що прикметник "технічний" означає мовну поведінку / химерність та побічні ефекти компілятора, такі як виконання генерованого коду.
З цією метою відповідь: ні (*). (*) - "перегляньте посібник з процесора". Якщо ви працюєте з якоюсь кращою системою RISC або FPGA, можливо, вам доведеться перевірити, які інструкції генеруються і які коштують. Але якщо ви використовуєте досить багато будь-яку звичайну сучасну архітектуру, то немає суттєвої різниці рівня процесора в вартості між lt
, eq
, ne
і gt
.
Якщо ви використовуєте крайній випадок ви можете виявити , що !=
потрібно три операції ( cmp
, not
, beq
) проти двох ( cmp
,blt xtr myo
). Знову ж таки, RTM у цьому випадку.
Здебільшого причини - захисні / загартовувальні, особливо при роботі з покажчиками або складними петлями. Розглянемо
// highly contrived example
size_t count_chars(char c, const char* str, size_t len) {
size_t count = 0;
bool quoted = false;
const char* p = str;
while (p != str + len) {
if (*p == '"') {
quote = !quote;
++p;
}
if (*(p++) == c && !quoted)
++count;
}
return count;
}
Менш надуманим прикладом може бути те, коли ви використовуєте зворотні значення для виконання приростів, приймаючи дані від користувача:
#include <iostream>
int main() {
size_t len = 5, step;
for (size_t i = 0; i != len; ) {
std::cout << "i = " << i << ", step? " << std::flush;
std::cin >> step;
i += step; // here for emphasis, it could go in the for(;;)
}
}
Спробуйте це і введіть значення 1, 2, 10, 999.
Ви можете запобігти цьому:
#include <iostream>
int main() {
size_t len = 5, step;
for (size_t i = 0; i != len; ) {
std::cout << "i = " << i << ", step? " << std::flush;
std::cin >> step;
if (step + i > len)
std::cout << "too much.\n";
else
i += step;
}
}
Але те, що ви, мабуть, хотіли
#include <iostream>
int main() {
size_t len = 5, step;
for (size_t i = 0; i < len; ) {
std::cout << "i = " << i << ", step? " << std::flush;
std::cin >> step;
i += step;
}
}
Існує також щось упереджене до конвенції <
, оскільки замовлення в стандартних контейнерах часто покладається на operator<
, наприклад, хешування в декількох контейнерах STL визначає рівність, кажучи
if (lhs < rhs) // T.operator <
lessthan
else if (rhs < lhs) // T.operator < again
greaterthan
else
equal
Якщо lhs
і rhs
є визначений користувачем клас, пише цей код як
if (lhs < rhs) // requires T.operator<
lessthan
else if (lhs > rhs) // requires T.operator>
greaterthan
else
equal
Виконавець повинен передбачити дві функції порівняння. Так <
став прихильним оператором.
i++
наi+=2
(наприклад), вона працюватиме дуже довго (або, можливо, назавжди). Тепер, оскільки ви зазвичай використовуєте<
для тих випадків, коли ви збільшуєте ітератор більше ніж на 1, ви також можете використовувати його<
і для випадку, коли ви збільшуєте його на 1 (для послідовності).