Considero que el adjetivo "técnico" significa comportamiento / peculiaridades del lenguaje y efectos secundarios del compilador, como el rendimiento del código generado.
Para este fin, la respuesta es: no (*). El (*) es "consulte el manual de su procesador". Si está trabajando con algún sistema RISC o FPGA de caso extremo, es posible que deba verificar qué instrucciones se generan y cuánto cuestan. Pero si usted está usando casi cualquier arquitectura moderna convencional, entonces no hay diferencia significativa nivel de procesador de costo entre lt
, eq
, ne
y gt
.
Si está utilizando un caso extremo se puede encontrar que !=
requiere tres operaciones ( cmp
, not
, beq
) frente a dos ( cmp
, blt xtr myo
). De nuevo, RTM en ese caso.
En su mayor parte, las razones son defensivas / endurecimiento, especialmente cuando se trabaja con punteros o bucles complejos. Considerar
// 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;
}
Un ejemplo menos ingenioso sería donde está utilizando valores de retorno para realizar incrementos, aceptando datos de un usuario:
#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(;;)
}
}
Pruebe esto e ingrese los valores 1, 2, 10, 999.
Podrías evitar esto:
#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;
}
}
Pero lo que probablemente querías era
#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;
}
}
También hay un sesgo hacia una convención <
, porque a menudo se basa en ordenar en contenedores estándar operator<
, por ejemplo, el hash en varios contenedores STL determina la igualdad al decir
if (lhs < rhs) // T.operator <
lessthan
else if (rhs < lhs) // T.operator < again
greaterthan
else
equal
Si lhs
y rhs
es una clase definida por el usuario que escribe este código como
if (lhs < rhs) // requires T.operator<
lessthan
else if (lhs > rhs) // requires T.operator>
greaterthan
else
equal
El implementador tiene que proporcionar dos funciones de comparación. Así se <
ha convertido en el operador favorito.
i++
ai+=2
(por ejemplo), se ejecutará durante mucho tiempo (o posiblemente para siempre). Ahora, dado que normalmente se usa<
para aquellos casos en los que incrementa el iterador en más de 1, también podría usarlo<
para el caso en que lo incrementa en 1 (por coherencia).