Saya mengambil kata sifat "teknis" berarti perilaku bahasa / keanehan dan efek samping kompiler seperti kinerja kode yang dihasilkan.
Untuk tujuan ini, jawabannya adalah: tidak (*). (*) Adalah "silakan baca manual prosesor Anda". Jika Anda bekerja dengan sistem RISC atau FPGA case-edge, Anda mungkin perlu memeriksa instruksi apa yang dihasilkan dan berapa biayanya. Tapi jika Anda menggunakan hampir semua arsitektur modern konvensional, maka tidak ada perbedaan tingkat prosesor yang signifikan dalam biaya antara lt
, eq
, ne
dan gt
.
Jika Anda menggunakan kasus tepi Anda bisa menemukan bahwa !=
memerlukan tiga operasi ( cmp
, not
, beq
) vs dua ( cmp
,blt xtr myo
). Sekali lagi, RTM dalam hal itu.
Sebagian besar, alasannya defensif / pengerasan, terutama ketika bekerja dengan pointer atau loop kompleks. Mempertimbangkan
// 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;
}
Contoh yang kurang dibuat-buat adalah di mana Anda menggunakan nilai balik untuk melakukan peningkatan, menerima data dari pengguna:
#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(;;)
}
}
Coba ini dan masukkan nilai 1, 2, 10, 999.
Anda dapat mencegah ini:
#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;
}
}
Tapi yang mungkin Anda inginkan adalah
#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;
}
}
Ada juga sesuatu yang bias konvensi terhadap <
, karena pemesanan dalam wadah standar sering bergantung operator<
, misalnya hashing dalam beberapa wadah STL menentukan kesetaraan dengan mengatakan
if (lhs < rhs) // T.operator <
lessthan
else if (rhs < lhs) // T.operator < again
greaterthan
else
equal
Jika lhs
dan rhs
adalah kelas yang ditentukan pengguna menulis kode ini sebagai
if (lhs < rhs) // requires T.operator<
lessthan
else if (lhs > rhs) // requires T.operator>
greaterthan
else
equal
Implementor harus menyediakan dua fungsi perbandingan. Jadi <
sudah menjadi operator yang disukai.
i++
menjadii+=2
(misalnya), itu akan berjalan untuk waktu yang sangat lama (atau mungkin selamanya). Sekarang, karena Anda biasanya menggunakan<
untuk kasus-kasus di mana Anda meningkatkan iterator lebih dari 1, Anda mungkin juga menggunakan<
untuk kasus di mana Anda menambahnya dengan 1 (untuk konsistensi).