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
증가되지 않습니다, 당신은 변경하지만 경우 1
에 0
는이 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
'Nice programing' 카테고리의 다른 글
MySQL 루트 비밀번호 변경 (0) | 2020.12.27 |
---|---|
고정 너비 문자열을 왼쪽 정렬하는 방법은 무엇입니까? (0) | 2020.12.27 |
rxjs 플랫 맵 누락 (0) | 2020.12.27 |
이미지를 사용하기 위해 UITableView의 배경 (tableview 스타일은 "그룹화")을 어떻게 설정할 수 있습니까? (0) | 2020.12.27 |
iOS에서 사용자 지정 개체를 저장 / 직렬화하는 올바른 방법 (0) | 2020.12.26 |