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
.
이것의 일반적인 실제 사용은 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
'ProgramingTip' 카테고리의 다른 글
MySQL 루트 비밀번호 변경 (0) | 2020.12.26 |
---|---|
고정 너비를 정렬하는 방법은 무엇입니까? (0) | 2020.12.26 |
rxjs 플랫 맵 누락 (0) | 2020.12.26 |
이미지를 사용하기 위해 위해 UITableView의 배경 (tableview 스타일은 "그룹화")을 사용하는 방법? (0) | 2020.12.26 |
C # : 시스템 색상을 기반으로 더 밝은 / 어두운 색상 만들기 (0) | 2020.12.26 |