ProgramingTip

if (1 ||! Foo ())를 사용하는 이유가?

bestdevel 2020. 12. 26. 15:57
반응형

if (1 ||! Foo ())를 사용하는 이유가?


레거시 코드를 읽었습니다.

if ( 1 || !Foo() )

쓰지 않는 이유가 있습니까?

if ( !Foo() )

둘은 동일하지 않습니다 . 평가하지 않습니다 먼저 Foo()인해 1를 단락을 ||.

완료 이유-누군이 then목적으로 브랜치에 강제 로 항목을 입력 하고 그대로 두었을 것입니다. 이 소스 제어 이전에 생성 된 것이 있기 때문에 코드가 완화되는 것을 의미하지 않고 지금은 우회 할 수 있습니다 .


if (1 || !Foo() )항상 만족할 것입니다. 단락 평가!Foo() 때문에 도달하지 않을 것 입니다.

아래의 코드 이것은 if가 실행되도록하고 싶지만 디버그 목적으로 실제 보기 조건 을 제거하고 싶지 않을 때 발생합니다.

도움이 될 수있는 추가 정보 :

  • if(a && b)-경우 a이며 false, b확인되지 않습니다.
  • if(a && b)- 경우 a이며 true, b그것의 경우 때문에, 확인됩니다 false, 표현식이 될 것입니다 false.
  • if(a || b)-경우 a이며 true, b이 때문에 검사하지 true않습니다.
  • if(a || b)-경우 a이며 false, 경우 b때문에, 확인 될 것 b입니다 true후가 될 것입니다 true.

이 목적을위한 매크로를 사용하는 것이 좋습니다. 예를 DEBUG_ON 1들어 프로그래머가 의미하는 바를 더 쉽게 이해 하고 코드에 매직 넘버 를 넣지 않도록합니다 (@grigeshchauhan에게 감사드립니다).


1 || condition

가 참인지 아닌지에 관계없이 항상 참 condition입니다. 이 경우 condition는 평가되지 않습니다. 다음 코드 :

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

은 출력 5이후 c증가되지 않습니다,은 변경하지만 당신 경우 10는이 c++실제로 출력을, 호출 할 것이다 6.


이것의 일반적인 실제 사용은 true로 평가되는 조건이 거의 없을 때 호출되는 코드를 테스트하려는 경우입니다.

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

이 방법 condition은 평가되지 않은 것이 // code I want to test항상 호출됩니다. 그러나 다음과 같지는 않습니다.

if (condition) { ...

condition평가 실제로 되는 진술 입니다 (귀하의 경우 그리고 Foo에는 호출됩니다)


질문에 대답했습니다. 차이점은 또는 작업의 오른쪽이 단락되어 블록에 강제로 진입하는 디버그 코드임을 나타냅니다.

그러나 모범 사례를 위해, 모범 모범 사례를 쓰게 찌르기 위해 선호도를 높이는 순서대로 대안을 제안합니다 (최선이 마지막입니다).

참고 : 예제를 코딩 한 후 이것은 C ++ 질문이고 예제는 C #입니다. 번역 할 수 있기를 바랍니다. 누군가 나를 필요로하는 경우 댓글을 게시하십시오.

인라인 주석 :

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

라인 외부 주석 :

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

이름 표시 기능

//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()"))...

그리고 정말 강력한 솔루션을 원하면 소스 제어에 리포지토리 규칙을 추가하여 ForceConditionForDebug를 호출하는 체크인 된 코드를 거부 할 수 있습니다. 이 코드는 의도를 분명히 전달하지 않기 때문에 그런 식으로 작성해서는 안됩니다. 체크인 (또는 체크인이 허용)되어서는 안되며 (소스 제어? 피어 리뷰?) 프로덕션에서 현재 형식으로 실행되도록 허용해서는 안됩니다.

참조 URL : https://stackoverflow.com/questions/19292318/is-there-any-reason-for-using-if1-foo

반응형