Nice programing

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

nicepro 2020. 12. 27. 20:44
반응형

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.


이것의 일반적인 실제 사용은 참으로 평가되는 조건이 거의 충족되지 않을 때 호출되는 일부 코드를 테스트하려는 상황에서 사용됩니다.

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

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

if (condition) { ...

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


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

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

참고 : 예제를 코딩 한 후 이것은 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()"))...

And if you wanted a really robust solution, you could add a repository rule to source control to reject any checked in code that called ForceConditionForDebug. This code should never have been written that way because it obviously doesn't communicate intent. It never should have been checked in (or have been allowed to be checked in) (source control? peer review?) And it should definitely never be allowed to execute in production in its current form.

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

반응형