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, ney 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 lhsy rhses 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).