C benzeri dillerde “kısa devre” nedir?


15

"Kısa devre" teriminin C, C ++, C #, Java ve diğer pek çok alanda kullanıldığını duydum. Bu ne anlama geliyor ve hangi senaryoda kullanılacak?


6
Konsept hakkında bir Wikipedia makalesi bulunmaktadır: en.wikipedia.org/wiki/Short-circuit_evaluation&& Operatörün değerlendirilmesinde bir optimizasyondur .
wirrbel

1
@wirrbel Ben de bunun için geçerli olduğuna inanıyorum ||... en azından gerekir.
Radu Murzea

1
@RaduMurzea Gerçekten. Kontrast ||ve &&karşı &ve |ince farkı görmek. 1 || printf("yay");0 || printf("yay");1 | printf("yay");0 | printf("yay");
Farklılıkları

Yanıtlar:


36

C'deki kısa devre, mantıksal bir operatörün tüm argümanlarını değerlendirmediği zamandır.

Örneğin &&, 0 && WhoCaresne olursa olsun yanlış olacağı açıktır WhoCares. Bu nedenle, C sadece değerlendirmeyi atlar WhoCares. Aynı şey geçerli 1 || WhoCares, her zaman doğru olacak. Bu nedenle, şöyle kod yazabiliriz

CanFireMissiles && FireMissiles()

Bu şekilde, imkansız bir operasyon yapmaktan kaçınırız. Füzeleri ateşleyemezsek kesinlikle denemek istemiyoruz. Bu, işaretçilerle, özellikle dosya işaretçileriyle yaygın olarak kullanılır.

 bool isN(int* ptr, int n){
     return ptr && *ptr == n;
 }

Bu, gereksiz bilgi işlemden kaçınmak için diğer birçok yararlı yolla ortaya çıkar

 isFileReady() || getFileReady()

Eğer ihtiyacımız yoksa ekstra iş yapmaktan kaçınır.


1
İstediğiniz zaman, sorunuza yanıt
verdiysem

7
Sevmiyorum CanFireMissiles && FireMissiles(), çünkü yan etkileri tetiklemek için kısa devreyi kötüye kullandığınızdan şüpheleniyor. Eylemleri şartlı olarak saklıyormuşsun gibi hissediyorum. Bu kod daha iyi if(CanFireMissiles){FireMissiles();}veya olarak yazılır if(CanFireMissles){didFireMissiles = TryFireMissiles(); if(didFireMissiles){...}}.
Brian

2
Tek kullanımın yan etkileri gizlemek olduğunu iddia ediyorum. Genellikle "Bir şehri havaya uçurmak" türü değil, bir göstergenin kayıttan çıkarılması veya sistem kaynaklarının kullanılması gibi şeyler de bu şekilde C'de sık sık yapılır. Vikipedi sayfasına bakın, kullanımdaki tüm bölüm "Yan etkileri gizleme" dir
Daniel Gratzer

2
@jozefg ayrıca, IsInDatabase'in zaman alabileceği pahalı işlemlerin yapılmasını önlemek için de kullanabilirsiniz IsInCache(value) || IsInDatabase(value)(özellikle bir mobil cihaz kullanmak ve ağ gecikmesi bir sorunsa).
mgw854

4

"Kısa Devre " tipik olarak sadece C'ye özgü değil, genel bir kavram olan " Kısa Devre Değerlendirmesi " anlamına gelir .

Boole operatörleri değerlendirme soldan sağa doğru olduğundan, diğer terimleri gereksiz kılacak terimler yararlıdır. Böylece, daha sonra diğer koşulları dışlayan bir durum olup olmadığını kontrol ederek, her şeyi değerlendirmek yerine mantıksal işlemlerin kısmi bir değerlendirmesine izin verebilirsiniz.

Misal:

while((x && y) == 1) {
    //This bit will not execute if x is 0 or y is 0 but y won't even be 
    //evaluated due to short circuit evaluation if x is 0.
}

Daha karmaşık bir örnek:

if((a || b || c || d || e || f || g || h || i || j || k) == 1) {
    /* If any of these are equal to 1 the whole expression is equal to 1,
     * thus doesn't it make sense to short circuit evaluate this?
     * Saves a bunch of time.
     */
}

8
Kısa devre, zamandan tasarruf etmek değil, değerlendirilmemekle ilgilidir. Değerlendirilmeyen bir fonksiyonun da değerlendirileceği yan etkisi olmayacaktır.
Pieter B

Bilirsiniz, == 0sadece gereksiz değil, aynı zamanda bazı insanları da şaşırtabilir.
Tekilleştirici

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.