Entendo o adjetivo "técnico" como comportamento / peculiaridades da linguagem e efeitos colaterais do compilador, como desempenho do código gerado.
Para esse fim, a resposta é: não (*). O (*) é "por favor consulte o manual do processador". Se você estiver trabalhando com algum sistema RISC ou FPGA de ponta, talvez seja necessário verificar quais instruções são geradas e quanto custam. Mas se você estiver usando praticamente qualquer arquitetura moderna convencional, não haverá diferença significativa no nível do processador no custo entre lt
,eq
, ne
e gt
.
Se você estiver usando um caso de borda, poderá descobrir que !=
requer três operações ( cmp
,not
, beq
) contra dois ( cmp
, blt xtr myo
). Mais uma vez, a RTM nesse caso.
Na maioria das vezes, os motivos são defensivos / endurecedores, especialmente ao trabalhar com ponteiros ou loops complexos. 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;
}
Um exemplo menos artificial seria onde você está usando valores de retorno para realizar incrementos, aceitando dados de um usuário:
#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(;;)
}
}
Tente isso e insira os valores 1, 2, 10, 999.
Você pode impedir isso:
#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;
}
}
Mas o que você provavelmente queria 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;
}
}
Há também um viés de convenção <
, porque a ordem em contêineres padrão geralmente depende operator<
, por exemplo, o hash em vários contêineres STL determina a igualdade dizendo
if (lhs < rhs) // T.operator <
lessthan
else if (rhs < lhs) // T.operator < again
greaterthan
else
equal
Se lhs
e rhs
é uma classe definida pelo usuário, escrevendo este código como
if (lhs < rhs) // requires T.operator<
lessthan
else if (lhs > rhs) // requires T.operator>
greaterthan
else
equal
O implementador deve fornecer duas funções de comparação. Então, <
tornou-se o operador preferido.
i++
parai+=2
(por exemplo), ele será executado por um período muito longo (ou possivelmente para sempre). Agora, como você normalmente usa<
para os casos em que você incrementa o iterador em mais de 1, você também pode usar<
também para o caso em que você incrementa em 1 (por consistência).