"Teknik" sıfatını dil davranışı / tuhaflıkları ve oluşturulan kodun performansı gibi derleyici yan etkilerini kastediyorum.
Bu amaçla cevap: hayır (*). (*) "Lütfen işlemci kılavuzunuza bakın". Bazı kenar kasa RISC veya FPGA sistemi ile çalışıyorsanız, hangi talimatların üretildiğini ve bunların maliyetini kontrol etmeniz gerekebilir. Ancak hemen hemen her türlü geleneksel modern mimariyi kullanıyorsanız, maliyetler arasında önemli bir işlemci seviyesi farkı yoktur.lt
, eq
, ne
ve gt
.
Bir kenar kasası kullanıyorsanız,!=
üç operasyonları (gerektirir cmp
, not
, beq
ikisi (vs) cmp
, blt xtr myo
). Yine, bu durumda RTM.
Çoğunlukla, özellikle işaretçilerle veya karmaşık döngülerle çalışırken nedenleri savunma / sertleştirme. Düşünmek
// 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;
}
Daha az anlaşılır bir örnek, artışları gerçekleştirmek ve bir kullanıcıdan veri kabul etmek için dönüş değerlerini kullandığınız durumdur:
#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(;;)
}
}
Bunu deneyin ve 1, 2, 10, 999 değerlerini girin.
Bunu engelleyebilirsiniz:
#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;
}
}
Ama muhtemelen istediğin şey
#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;
}
}
Ayrıca, konvansiyona yönelik bir önyargının da bir <
nedeni vardır, çünkü standart kaplarda sipariş vermek sıklıkla kullanılır operator<
, örneğin birkaç STL kapında hashleme,
if (lhs < rhs) // T.operator <
lessthan
else if (rhs < lhs) // T.operator < again
greaterthan
else
equal
Eğer lhs
ve rhs
kullanıcı tanımlı sınıf bu kodu olarak yazıyoruz
if (lhs < rhs) // requires T.operator<
lessthan
else if (lhs > rhs) // requires T.operator>
greaterthan
else
equal
Uygulayıcı iki karşılaştırma işlevi sağlamalıdır. Böylece <
tercih edilen operatör haline geldi.
i++
içini+=2
(örneğin), o (sonsuza muhtemelen ya) çok uzun bir süre boyunca çalışacaktır. Şimdi,<
yineleyiciyi 1'den fazla artırdığınız durumlarda genellikle kullandığınız için , 1 ile artırdığınız<
durumda da kullanabilirsiniz (tutarlılık için).