boolean_variable보다! boolean_variable을 사용하는 이유 == false


59

이 질문에 대한 의견 : 메소드가 false를 리턴하는지 확인 : 결과를 임시 변수에 지정하거나 메소드 호출을 조건부로 직접 넣습니까? 조건을 테스트 할 때 !boolean대신 사용해야한다고 말합니다 boolean == false. 왜? 나에게는 boolean == false영어가 훨씬 더 자연스럽고 더 명확합니다. 이것이 단지 스타일의 문제인지 사과하지만,이 선호도에 대한 다른 이유가 있는지 궁금합니다 !boolean.


28
쓰는 것이 더 짧습니다.
제논

39
그것은하는 것과 같습니다 boolean == true. 말이되지 않습니다. if명령문 내부의 표현식 은 표현식입니다. 부울 표현식으로 이미 평가 된 것이 있으면 왜 그것을 평가하도록 체크를 추가하겠습니까?
Maxpm

10
@zzzzBov : 음. 대부분의 (C 스타일) 프로그래머는 그렇게하지 않습니다.
amara

9
@zzzzBov : 귀하의 의견이 모호합니다. 이것이 !boolean_variable대부분의 C 프로그래머가하는 방식 임을 의미한다면 , 나는 동의한다.
Keith Thompson

29
그리고 더 중요한 것은, 아무도 어떻게 글을 쓰고 싶어하지 boolean != true않습니까?

답변:


153

내가 좋아하는 라인을 볼 때 if (!lateForMeeting()), 본인은 그와 같은 "그렇지 않으면 늦게 회의" 반대로 이해하기 매우 직선적이다, if (lateForMeeting() == false)나는대로 읽었다있는 내가 회의에 늦었 사실이 거짓이면 " " .

그것들의 의미는 동일하지만 전자는 동등한 영어 문장이 어떻게 구성되는지에 더 가깝습니다.


27
+1 파이썬에서는 실제로 다음과 같이 씁니다 if not late_for_meeting:)
phunehehe

42
"___가 거짓 인 경우"가 "___가 아닌 경우"보다 더 자연스럽게 들린다면, ___의 이름을 개선해야한다고 주장합니다.
Mike DeSimone

12
Perl에서는 다음과 같이 쓸 수 있습니다unless late_for_meeting
Henrik Ripa

4
@HenrikRipa : 입력 할 수있는 것은 Perl의 법률 코드 인 것 같습니다. 그것이 당신이 원하는 것을하는지의 여부는 또 다른 질문입니다;)
Adam Robinson

4
@ A-Cube 처음부터 그런 방법이 없을 것입니다. 대신에라는 메소드가 done()있습니다. 이중 부정은 나쁘다.
kba

97

쓰기 == false== true중복입니다. 그것은 또한 임의의 극단으로 가져갈 수 있습니다. 당신이 쓰기 시작하면

if (condition == false) { ... }

그럼 왜 안돼

if ((condition == false) == true) { ... }

아니면 왜 안돼

if ((someExp == anotherExp) == true) { ... }

이 이야기의 교훈은 condition부울 표현식 인 경우 추가 할 필요가 없다는 것입니다 == false. 그게 연산자 !입니다;)


이것을 생각하지 않았다!
ell

51
== false중복되지 않고 단지보다 장황합니다 !. OTOH == true는 중복입니다.
dan04

4
@ dan04 당신이 맞아요. 그러나 내가 의미하는 바에 따르면, 그것은 나쁜 생각으로 남아 있습니다. (exp1 != exp2)vs를 고려하십시오 ((exp1 == exp2) == false). 틀림없이 이러한 시나리오는 잘 짜여진 시나리오이지만, 여전히 참 또는 거짓에 대한 명시 적 비교를 작성해서는 안됩니다. operator !=를 사용해야하는 것처럼을 사용해야합니다 !.
Andres F.

26
@ dan04 : 언어가 이미 제공 할 때 중복됩니다 !.
DeadMG

5
@ dan04 : 당신이 쓰는 모든 시간 bool_expression == bool_literal의가 == ...중복입니다. 참인지 거짓인지 테스트하는 것은 중요하지 않습니다. 결과 / 대체 블록 순서의 변화 일뿐입니다. Andres의 예제는이 점을 완벽하게 보여줍니다. 대부분의 최신 컴파일러는 중복성을 최적화하지만 여전히 중복입니다.
Lèse majesté

70

C와 일부 유사한 언어에서,에 평등에 대한 부울 표현식을 비교 false하거나 true위험한 습관이다.

C에서는 스칼라 표현식 (숫자 또는 포인터)을 예를 들어 if명령문 의 조건으로 부울 컨텍스트에서 사용할 수 있습니다 . 는 C 규칙 즉 if (cond)동일하다 if (cond != 0)제로가 false, 즉,과 - 어떤 아닌 값은 true입니다. 경우 cond포인터 형이고, 0널 포인터 상수로 취급되고 if (ptr)의미 if (ptr != NULL)합니다.

이것은

if (cond)

if (cond == true)

같은 것을 의미하지는 않습니다 . 첫 번째는 cond0이 아닌 경우에 해당됩니다 . 두 번째는 동일한의 경우에만 사실이다 trueC에서 (당신이 가지고있는 경우가있는 #include <stdbool.h>) 단순히 1.

예를 들어,에 isdigit()선언 된 함수는 인수가 숫자 인 경우 값 을 <ctype.h>반환하고 그렇지 않으면 0이 아닌 int값 을 반환합니다 0. 42조건이 true임을 나타 내기 위해 리턴 할 수 있습니다 . 비교 42 == true가 실패합니다.

그것이 0거짓으로 간주되는 유일한 값이기 때문에 평등에 대한 비교 false가 효과가 있습니다. if (!cond)if (cond == false)같은 일을한다. 그러나 당신이 그것을 이용하려면, 비교 false는 괜찮고, 비교 true는 그렇지 않다는 것을 기억해야 합니다. 최악의 경우와 비교하면 대부분의 시간 동안true 작동 합니다 (예를 들어, 평등 및 관계 연산자는 항상 0또는을 산출합니다 1). 이것은 이것을 사용하여 당신이 도입 한 모든 버그를 여전히 추적하기 어려울 수 있음을 의미합니다. (걱정하지 말고 중요한 클라이언트에게 코드를 데모하자마자 표시됩니다.)

C ++에는 약간 다른 규칙이 있습니다. 예를 들어, 해당 bool유형은 언어에 좀 더 밀접하게 통합되어 type으로 if (cond)변환 cond됩니다 bool. 그러나 그 효과는 (대부분) 동일합니다.

일부 다른 언어에는 더 나은 동작 부울이라고 부르는 언어가 있으며 그 cond == true와 같은 cond == false구문은 안전합니다. 그럼에도 불구하고 내가 본 모든 언어에는 not또는 !연산자가 있습니다. 거기에 있으므로 사용할 수도 있습니다. 사용 cond == false하기보다는 !condnot cond, 내 의견으로는, 가독성이 향상되지 않습니다. ( !캐릭터가 한 눈에보기 어려울 수 있다는 것은 사실입니다 . 때때로 !이것을 피하기 위해 공백을 추가합니다 .)

그리고 자주 문제를 피할 수 약간의 코드를 재 배열하여 선명도를 향상시킬 수 있습니다. 예를 들어,

if (!cond) {
    do_this();
}
else {
    do_that();
}

당신은 쓸 수 있습니다 :

if (cond) {
     do_that();
}
else {
    do_this();
}

그게 아니라 항상 더 나은,하지만 그것이 기회를 찾기 위해 다치게하지 않습니다.

요약 : C 및 C ++, 평등 비교에서에 truefalse위험한 지나치게 장황하고, 가난한 스타일이다. 다른 많은 언어에서는 이러한 비교가 위험하지는 않지만 여전히 지나치게 장황하고 스타일이 좋지 않습니다.


실제 유용한 기술 설명이있는 하나의 답변이므로 +1입니다.
Mike Nakis

프로그래밍 언어에 관계없이 항상 == true안전하지 않다고 생각합니다 . 그런 식으로 기분이 좋아집니다.
Dervall

1
@ Dervall : 단순히 그렇지 않은 것을 가정하는 것도 좋지 않습니다. 논리 값의 평등 비교 양방향 타입 추론과 강한 암시 적 캐스트가없는 타입 시스템을 가지고 하스켈에서 예를 들어, 안전 있지만, 사실은 적절한뿐만 아니라 경우 특정 언어에 몇 가지 코너 케이스가있다, 하나는 작성할 수 (==True) . f있음을 명확히 -> Boolreturn-polymorphic 함수 의 인스턴스화를 원합니다 f. 보다 명확 not . not . f하고 덜 어색합니다 (f :: a -> Bool).
leftaroundabout

또한 pred(x)==pred(y)bool-returning 함수 와 같은 작업을 수행하는 것이 적절 합니다 pred. pred(x)? pred(y) : !pred(y)당신이 동의 할 대안 은 거의 용납되지 않습니다.
leftaroundabout

1
@leftaroundabout : 당신이 알고 있다면 그건 괜찮 pred(x)pred(y)일부 언어가 아닌 다른 사람의 안전한 가정 인, 진리를 나타 내기 위해 같은 값을 사용합니다. 예를 들어 C에서는 다음과 같이 쓸 수 있습니다 !!pred(x) == !!pred(y).
Keith Thompson

13

경우 condition == false실제로 "훨씬 더 자연스러운 영어로"당신을 위해 나는 당신이 원어민없는 것으로 가정한다. 그렇지 않으면 아무도 그렇게 말하지 않기 때문에 이것을 설명 할 수 없습니다 .

태양이 빛나면 거짓은 집에 있습니다.

그것을 비교

태양이 비치지 않으면 집에 있습니다.

즉, 단일 슬림 !문자가 코드에서 쉽게 간과 된다는 데 동의합니다 . 이런 이유로 not언어에서 지원 하는 키워드를 선호합니다 . 예를 들어 C의 ++는 않습니다 많은 프로그램이인지하지 않지만이 할 수 있습니다.

이 필요한 언어의 경우 !연산자와 피연산자 사이에 공백을 넣습니다. 이로 인해 부정을 간과하기가 훨씬 어려워집니다.

if (! condition) { … }

모든 프로그래머는 이것을 다시 생각하지 않고 자동으로 "무조건" 으로 번역해야합니다 . 코드 관용구를 읽을 때 이런 유창함을 얻는 것은 좋은 프로그래머가되기위한 첫 단계 중 하나입니다.


13

둘은 기능적으로 동일하므로 사용하는 것이 맛의 문제입니다.

가장 큰 이유는 내가 사용은 == false내가 발견 한 것입니다 !코드를 볼 때, 간과하기가 너무 쉽다.

이것에 의해 심하게 물린 후, 나는 거짓을 테스트 할 때 그것을 분명히하는 습관을 들였습니다.


운영자가 not파스칼에서와 같이 지명 되었다면 이것이 문제가되지 않았다고 생각합니다.


5
바로이 이유 때문에, 나는 몇 가지 의료 기기 소프트웨어에서 일한 C ++ 프로젝트를 위임 코딩 표준이 있었다 == false대신 !이 같은 이유 (이 우수하)에 대한합니다. 그러나을 사용할 필요가 없었 == true으므로 0이 아닌 값은 여전히 ​​정상적으로 작동했습니다.
tcrosley

12
나는 항상이 주장이 설득력이 없다는 것을 발견했다. C / C ++ / C # / Java / etc에는 단일 문자를 보지 못하면 코드 해석에 비슷한 영향을 미치는 다른 장소가있다. "!" 유일한 나쁜 사람은 이해가되지 않기 때문에.
Bevan

5
@bevan 분명히 당신은 아직 물지 않았습니다.

1
간과하는 !것이 아마도 이런 종류의 가장 번거로운 실수 라는 데 동의하지만 , IMO는 작문 습관을 기르지 ==false않고 더 나은 단위 테스트를 작성해야합니다.
leftaroundabout

8
@ ThorbjørnRavnAndersen 상당히 반대입니다. 저는 몇 년 동안 모든 캐릭터읽도록 가르쳤습니다 . 나는 모든의 저자 아니에요 (또는 대부분) 나는 매일 매일을 읽을 수있는 코드, 그래서 우리는 여기에서 논의하고 같은 개인 규칙은 최소한의 값을 가지고 : 내가 제대로 이해하는 데 필요한 모든 , 내가 읽은 코드를하지 내가 쓴 것들.
Bevan


6

때때로 boolean = false(명확한 오류와 함께) 글을 쓸 수 있고 false == boolean자연스럽지 않은 것처럼 보일 수 있기 때문입니다 (실습이 아무리 좋더라도)


오래 전에 프로그래밍을 처음 시작했을 때 저의 멘토가 if( INVALID_HANDLE_VALUE == hFile )그런 일 을 피하는 습관을 들일 것을 제안 했습니다. 그렇게하면 두 개가 아닌 하나의 등호를 사용하면 컴파일러 오류가 발생합니다. 분명히 이것은 왼쪽 표현이 상수 일 때만 작동하지만 계산할 수있는 것보다 더 많은 두통을 저축했습니다.
Drew Chapin 2012

정적 분석 도구를 사용하면 수백 배나 더 많은 두통을 줄일 수 있으며 자연스럽게 hFile==INVALID_HANDLE_VALUE 글 을 복원 할 수 있습니다.
Gqqnbig

4

if (!boolean_variable)로 번역됩니다 if the condition is not true.

if (boolean == false)로 번역됩니다 if the condition not false is true. 그것은 반대 논리이기 때문에 이해하기가 더 어렵습니다.


3
! true는 사실이 아닙니다. ! boolean 은 논리 반전 인 부울 값에 따라 false가 아니 거나 true가 아님을 의미합니다 .
S.Robins 2012

1
@ S.Robins 부울 변수에 대한 어리석은 부울 이름을 찾습니다. 예를 들어 isVisible더 좋은 예가 될 것입니다. 그렇다면 if (!isVisible)보이지 않는 것을 의미 할 것 if (isVisible==false)입니다. 이는 이해하기가 더 간단하며 , 이는 역 논리입니다. 더 명확 해지기를 바랍니다. 아니면 당신의 의견을 잘못 이해 했습니까?
BЈовић

2

(많은) 구형 컴파일러에서는 2 개의 레지스터 할당과 기계 언어의 비교 코드로 (부울 == false) 나눌 것이라고 생각합니다. 첫 번째 예는 하나의 할당과 NOT 연산자로 나뉩니다. 성능 측면에서, 비교 연산은 비교되는 레지스터의 크기에 따라 비트 단위 반전 (1 클럭)과 비교하여 여러 클럭 사이클을 필요로하며 실행 속도가 느려집니다.

즉, 최신 컴파일러는이 문제를 해결한다고 생각하므로 어느 쪽이든 사용하는 것이 좋습니다.


기계어 코드 생성은 고급 언어 프로그래머가 아닌 컴파일러의 작업입니다.
CVn

역사적 이유로, 이는 한 방법이 다른 방법보다 선호되는 이유 중 하나 일 수 있습니다.
Legolas

1

직장에서 종종 null이 될 수있는 부울을 처리 하므로이 경우를 자주 코딩합니다.

if (value != null && value == true){
    //do something
}

개인적으로 대칭이 읽기 쉬워지기 때문에 특히 테스트중인 다른 부울이있는 경우.

나는 실제로 어떤 식 으로든 상관하지 않습니다.


4
그렇다면 value == truenull이 아닌지 확인할 이유가 없습니다. 경우 value == null는 첫번째 장소에있는 경우 문을 유발해서는 안됩니다, 그래서 if (value)충분합니다.
zzzzBov

1
부울은 객체 (Java)이므로 null 일 수 있으므로 if (value)예외가 발생합니다. 공감하는 사람들이 이유를 밝히면 감사하겠습니다.
WuHoUnited

3
나는 단지 이것을 보았고 downvote하지 않았다. 부울 널은 좋지 않습니다. 왜? 부울은 일반적으로 켜져있는 상태를 나타냅니다. 대부분의 경우 처음에 거짓을 선언 한 다음 동작과 함께 변경하려고합니다. 부울이 초기화되지 않는 것은 매우 드문 일입니다.
Aubergine

나는 Aubergine에 동의해야합니다. 나는 스스로 bools를 초기화하지 않은 채 나쁜 습관 (특히 Java)에 빠져서 null을 확인하게됩니다. 나는 이것이 언어의 결함이라고 생각하지만, 그 결함을 사용자에게 부과합니다. 새로운 bool 변수를 선언 할 때 기본적으로 초기화하지 않고 false로 설정해야합니다.

2
@WuHoUnited는 값이 null 인 경우에도 value == true충분합니다.
zzzzBov

1

실제 조건을 테스트 할 때 if (condition)특히 'is'로 시작하는 부울 변수 이름 지정 규칙을 적용 할 때 특히 그렇습니다. if (isOpen)완전히 명확하고 사용 != false이 중복됩니다.

C / C ++ / Java / etc의 경우 프로그래머, '!'의 의미 우리가 그것을 볼 때 우리 마음에 자동적으로 '하지 않는'지점까지 연산자는 완전히 동화됩니다. 따라서 나 if (!isOpen)만큼이나 분명 if (_NOT_ isOpen)합니다. 그러나 C / C ++에서는으로 매크로를 만들 수 있습니다 #define _NOT_ !. 그러나 몇 년 후에 이것은 완전히 불필요합니다.

그 외에도 부울 값을 리터럴과 비교하지 않고 테스트하는 것이 항상 바람직합니다. 예를 들어, if (x == true)부울 값이 0이 아닌 경우 true로 간주되고 리터럴 true에는 하나의 특정 값만 있으므로 x는 'true'(예 : 0이 아님) 일 수 있으며 비교는 false로 평가되므로 테스트하기에는 위험 합니다. 2를 포함하고 문자 그대로 true는 1입니다.) 물론 거짓을 가진 비교에는 적용되지 않지만, 사실을 테스트 할 때 사용하지 않는다면 왜 거짓을 테스트 할 때 사용합니까?


C ++에서 이미 'not'을 이해하므로 제안한 C ++ 매크로를 만들 필요는 없습니다. 관련 : stackoverflow.com/questions/2393673/c-and-or-x-xor-keywords
frozenkoi

사실이지만 C ++ 0X 표준의 키워드입니다. 그 전에는 또 다른 매크로였습니다.
Fabio Ceconello

0

크기 문제;)

혼합 식에서는 읽기가 더 쉽습니다.

boolean1 = false
boolean2 = true

p ! boolean1 and ! boolean2
p boolean1 == false and boolean2 == false

그리고 루비의 경우 큰 차이가있는 예가 있습니다.

boolean = nil
p ! boolean         #-> true
p boolean == false  #-> false

nil은 거짓이 아니지만 사실도 아닙니다.


0

내 경험과 귀하가 연결 한 내 질문에 대한 답변을 바탕으로합니다.

어떤 사람들은 if (조건)을 사용하는 것을 선호하는데, 그 이유는 쓰기 시간이 짧기 때문입니다. 그리고 나를 위해 실제로 의미가 있습니다. 예를 들어 (! isValidated ()) 나는 이것을 Not Validated로 읽습니다. 그러나 나를 위해 그것은 모두 개인 취향을 기반으로하며, true 또는 false를 반환하면 isValidated () 메서드의 논리적 구조에 따라 다릅니다.


0

변수의 이름을 올바르게 지정하면 !boolean더 자연 스럽습니다. 그것은으로 읽고 not boolean하는 프로그래머 충분히의 사람에게 코드를 읽어 정신적.


0

어떤 사람들에게는 의미가 빠를수록 빠를수록 좋습니다.

"if! ..."를 가진 사람들은 "if ..."와 더 빨리 비교 한 다음 전체 조건 (실제로는 꽤 길 수 있습니다 (예 : (thisThing = thatThing 또는 무언가 = 다른 것))을 읽어야합니다. thinga = thingb 및 thinga = thingd) 등)) == false를 끝에 찾으십시오.

데! (실제로 언어가 허용하는 경우 not을 선호합니다) 바로 앞의 상태에서 영어 'not'을 얻습니다.

이 문제는 또한 until그것을 지원하는 언어로 사용하는 것을 고려해야합니다 . 다른 사람들이 말했듯이 자연어 표현이 목표입니다. 위의 "태양이 빛나고"있는 예를 좋아합니다.


0

또 다른 이유는 여러 언어를 사용하는 코드베이스에서 작업하는 경우 모든 언어에서 안전한 작업을 수행하는 관용적 방법이 하나라도 있으면 모든 곳에서 그렇게하는 것이 좋습니다. 넘어 질 가능성이 적습니다

나는 어디 생각할 수 없다 if (!variable)(예 또는 등가물 if not variable예 : 반면, 언어에 따라)가 안전하지 if self.is_ready() == False: ...파이썬에서 안전하지 않은 경우 self.is_ready()반환 None이에 할을 위해 완전히 합리적인 일이 될 것입니다, 현재 또는 미래에, 이후이 준비가되어 있지 않았다 나타냅니다 None마찬가지로 falsey과 같다 False.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.