Я использую прилагательное «технический», чтобы обозначить поведение / причуды языка и побочные эффекты компилятора, такие как производительность сгенерированного кода.
Для этого ответ: нет (*). (*) «Пожалуйста, обратитесь к руководству по вашему процессору». Если вы работаете с какой-либо периферийной системой 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 (для согласованности).