Soru Kullanmak için herhangi bir sebep var mı (1 ||! Foo ())?


Eski bir kod okudum:

if ( 1 || !Foo() )

Yazmamak için herhangi bir sebep var mı?

if ( !Foo() )

56
2017-10-10 09:42


Menşei


'1 || bir şey () 'her zaman doğru olacaktır. Bu yüzden iki ifade eşdeğer değil, ama bunun neden yapıldığına gelince, geç. - SinisterMJ
if (1 || !foo()) <==> if (1). - devnull
Muhtemelen bu, şartlı koşullara (belki de bir hata, geçici çözüm veya yeniden düzenleme) zorlamak ve geri getirilmemek için geçici olarak yapılmıştır. Bunun değiştirildiği sürümü bulmak için kaynak kontrolünüzün ek açıklama / suçlama özelliğini kullanın - neden değiştirildiğini anlamak için faydalı bir yorum veya hata veritabanı girişi alabilirsiniz - the_mandrill
Belki Foo () olarak uygulanmaktadır return rand() % 2; - Happy Green Kid Naps
1 && !Foo() eşittir !Foo() - Niklas R


Cevaplar:


İkisi değil aynısı. İlk asla değerlendirmeyecek Foo() Çünkü 1 kısa devreler ||.

Neden bitti - muhtemelen birisi girişe zorlamak istedi then hata ayıklama amaçları için şube ve orada bıraktı. Ayrıca bu, kaynak kontrolünden önce yazılmış olabilir, bu yüzden kodun kaybolmasını istemediler, sadece atladılar şimdilik.


134
2017-10-10 09:44



Gelişim / hata ayıklama sırasında takılan bir şey gibi geliyor ve birileri onu çıkarmayı unuttuğundan ya da bir şeyi kırmaktan korktuğu için orada kalıyordu. - Medinoc
Her durumda, derleyici inaktif kodları kontrol etmeye devam ettiğinden, bu yorum yapmaktan daha iyi bir çözümdür. Bunu hata ayıklama nedenleriyle her zaman yaparım. - usr
Sadece gerçekten çok deneyimli bir geliştirici bunu biliyor. +1 - Baby


if (1 || !Foo() ) her zaman memnun olacak. !Foo() nedeniyle ulaşılamayacak bile kısa devre değerlendirmesi.

Bu, aşağıdaki kodun altında olduğundan emin olmak istediğinizde olur if yürütülür, ancak gerçek Muhtemelen hata ayıklama amaçları için.

Size yardımcı olabilecek ek bilgiler:

  • if(a && b) - Eğer a olduğu false, b kontrol edilmeyecek.
  • if(a && b) - Eğer a olduğu true, b kontrol edilecek, çünkü eğer false, ifade olacak false.
  • if(a || b) - Eğer a olduğu true, b kontrol edilmeyecek çünkü true neyse.
  • if(a || b) - Eğer a olduğu false, b kontrol edilecek, çünkü eğer b olduğu true o zaman olacak true.

Bu amaçla bir makronun olması şiddetle tavsiye edilir DEBUG_ON 1Bu, programlayıcının ne anlama geldiğini anlamayı kolaylaştıracaktır. sihirli sayılar kodda (Teşekkürler @grigeshchauhan).


44
2017-10-10 09:44



Yani if(1 || !Foo() ) {code} == if(1){code} == {code} süre if (!Foo()) herhangi biri olabilir {code} ya da sadece ; tarafından döndürülen değere bağlıdır Foo(). :) - Grijesh Chauhan
Son ifadeleri uzatıyorum .. DÜZENLEME: hata ayıklama amacıyla ya bir makro kullanın DEGUG_ON = 1 veya yorumlayın. if (DEGUG_ON || !Foo())  (aslında ben kod yorumlayacağım). ;) - Grijesh Chauhan
"Bu amaç için bir makronun olması şiddetle tavsiye edilir, DEBUG_ON 1 deyin"... evet okunabilir hata bulmaya çalışırken kod okunabilirliği dışında son endişeniz :-) - Mehrdad
@Mehrdad Gerçekten. Ama bu hata kontrolü bir hatanın kendisine dönüşebilir .. Ya da OP'ye yaptığı gibi, bir kafa karışıklığı: D - Maroun


1 || condition

her zaman doğrudur, condition doğru ya da değil. Bu durumda condition asla değerlendirilmiyor. Aşağıdaki kod:

int c = 5;
if (1 || c++){}
printf("%d", c);

çıktılar 5 dan beri c değişmez, ancak eğer değiştiyseniz 1 için 0, c++ aslında çıkış yapmak, çıkış yapmak 6.


Bunun alışılmışın pratik bir kullanımı, yalnızca nadiren değerlendirilen koşulun yerine getirildiği zaman çağrılan bir kod parçasını test etmek istediğiniz durumdadır:

if (1 || condition ) {
    // code I want to test
}

Bu yoldan condition asla değerlendirilmeyecek ve bu nedenle // code I want to test her zaman çağrılır. Ancak kesinlikle aynı değil:

if (condition) { ...

nerede bir ifadedir condition aslında değerlendirilecek (ve senin durumunda Foo Aranacak)


11
2017-10-10 09:44



you don't want to wait till that condition will evaluate to true evet temel olarak kısa devreler infazları kaydetmek için bir tekniktir! - Grijesh Chauhan
@GrijeshChauhan: Performansa atıfta bulunmadım, ne zaman icra etme zamanı. Belirli kriterlere uyulmasını kastediyordum. - LihO
Bu tuhaf bir dil özelliği. Kondisyonun her zaman yan etkilere sahip olup olmadığına dayandığına inanıyorum (yani temelde konstrüksiyon dışı yöntemlerin ve statik işlevlerin değerlendirildiğini düşünüyordum, fakat basit bir "merhaba dünyasında" denedim ve durumun hiçbir zaman değerlendirilemediğini düşünüyorum. ilk dava O_O - GameDeveloper


Soru doğru cevaplandı - fark, ya da operasyonun sağ tarafı kısa devredir, bu da eğer if bloğa girişi zorlamak için hata ayıklama kodu olduğunu gösterir.

Fakat en iyi uygulamaların ilgisine göre, en azından benim en iyi uygulamadaki kaba bıçaklarım, tercihleri ​​arttırmak için alternatifler öneririm (en iyisi):

not: Örnekler kodlandıktan sonra bunun bir C ++ sorusu olduğunu fark ettim, örnekler C #. Umarım tercüme edebilirsin. Birinin bana ihtiyacı varsa, sadece bir yorum gönderin.

Çevrimiçi yorum:

if (1 /*condition*/) //temporary debug

Yorum dışı yorum:

//if(condition)
if(true) //temporary debug

İsim-Gösterge Fonksiyonu

//in some general-use container
bool ForceConditionForDebug(bool forcedResult, string IgnoredResult)
{
      #if DEBUG
          Debug.WriteLine(
              string.Format(
                  "Conditional {0} forced to {1} for debug purposes",
                  IgnoredResult,
                  forcedResult));
          return forcedResult;
      #else
          #if ALLOW_DEBUG_CODE_IN_RELEASE
              return forcedResult;
          #else
              throw new ApplicationException("Debug code detected in release mode");
          #endif
      #endif
}

//Where used
if(ForceConditionForDebug(true, "condition"))...

//Our case
if(ForceConditionForDebug(true, "!Foo()"))...

Ve gerçekten sağlam bir çözüm istiyorsanız, ForceConditionForDebug adlı kodda kontrol edilen herhangi bir kodu reddetmek için kaynak kontrolüne bir havuz kuralı ekleyebilirsiniz. Bu kod asla böyle yazılmamalı çünkü açık bir şekilde niyetle iletişim kurmuyor. Hiçbir zaman kontrol edilmemeli (ya da kontrol edilmesine izin verilmemiştir) (kaynak kontrolü? Akran incelemesi?) Ve üretimde kesinlikle mevcut haliyle uygulanmasına kesinlikle izin verilmemelidir.


10
2017-10-10 13:33