2009-10-22 5 views
7

다음 코드에서 (p != NULL) 대신 (!!p)을 사용하면 어떤 이점이 있습니까?이유/(p! = NULL) 대신 (!! p)

AClass *p = getInstanceOfAClass(); 
if(!!p) 
    // do something 
else 
    // do something without having valid pointer 
+22

'if (p)'가 무엇이 잘못되었는지 궁금합니다. – GManNickG

+1

절대적으로 아무것도. :) – Twisol

+3

운영자에게 과부하가 걸린 경우 항상 의심해야합니다. '! p' 나'! ='는 특별한 행동을 취하는 것이 가능합니다. – Kobi

답변

9

사실 그건 스타일의 문제입니다. 자세한 내용은 this very similar question을 참조하십시오.

null 포인터와 비교하여 IMO가 더 명확합니다.

3

는 최대한 멀리 볼 수있는, 그것은 부울 값으로 변환하는 단지 짧은 방법입니다. 그것은! 두 번이지만, p != NULL은 하나의 비교를 수행합니다. 따라서 !!p이 무엇을 의미하는지 알지 못한다면 이점은 더 짧은 코드 일 것입니다.

11

비록 내가 !!p이 나쁜 스타일이라고 생각하지만, 대개 똑같이 영리하려고하는 코더를 나타냅니다.

+4

영리한 코드를 작성하는 데 한 시간이 걸리면 몇 주 후에 두 가지를 이해하게됩니다. – Twisol

+2

전적으로 동의합니다. 그것은 "영리하려고 노력하고 실패했습니다"라고 읽었어야합니다. – Wernsey

0

그들은 동일하지만, 나는 그것은 더 읽을 수

NULL != p 

사용하는 것이 좋습니다.

+0

그건 개인적인 취향과 스타일에 불과합니다. –

+4

가독성은 논쟁의 여지가 있습니다. 개인적으로는 자연스럽게 읽을 수 없기 때문에 읽기 쉽지 않습니다. 나는 보통 'p가 NULL이 아니라면' 'NULL이 p가 아닌 경우'라고 말합니다. –

+3

예. 컴파일러가 "NULL = p"를 가져올 때 잘못된 "p = NULL"을 누락하는 것을 방지합니다. – ChrisBD

-2

두 번 부정을 사용하지 마십시오. 간단한 논쟁은 C++가 제한된 영어 하위 집합이고 영어가 이중 부정을 가지지 않기 때문에 영어 사용자는 무슨 일이 일어나고 있는지 분석하기가 어려울 것입니다.

+1

나는 당신이 거기에서 무엇을했는지 안다 ... – Twisol

+0

당신도 라틴어 수업을 들었을 경우를 제외하고, 이중 부정은 문맥에 따라 - 취소되지 않지만 부정의 의미가 증폭된다. – MP24

+2

그 외! (C++은 영어의 제한된 일부 임). – outis

-1

주어진 예제에는 차이가 없습니다.

이 모든 경우에 적용되는 가정이 잘못 그러나

. A = B 하지 아니 정수 타입 우려까지와 같이 A = B 동일하지 않다.

C에서 0은 거짓입니다. 0 이외의 항목은 모두 true입니다. 그러나 not 01이며 다른 것은 없습니다. C++에서 true는 1으로 정수로 변환됩니다. 10이 아니며 및 BOOL을 포함하여 C 불 유형에서 true를 나타내는 데 가장 많이 사용되는 값입니다. Win32. 결과가 예상 정수 값에 논리 값을 캐스팅 할 목적으로 !!의 사용을 배제하지 않는 if 상태의 평가에 대한 bool으로 캐스팅되어 있기 때문에

주어진 예제 코드 동안, !!p는 불필요합니다. 이 예에서 개인적으로 유형 변경 및 의미가 명확 할 확률을 최대화하기 위해 의미가 무엇인지 명확히하기 위해 NULL != p 또는 p != NULL을 사용합니다.

이 기술은 double-bang 관용구로 알려져 있으며 this guy provides some good justifications입니다.

+0

이 경우 이러한 정렬은 유효하지 않습니다. –

+0

실제로이 문맥에서 (p)와 if (!! p) *가 동일하면. 이것은 if의 조건이 bool로 변환되어 테스트 되었기 때문입니다. 이는 정확히 무엇입니까 !! 결국. 다시 링크 된 대답, C++에서 커널 놈들은 bool에 값을 던질 수있었습니다. –

+0

"예제 코드에서는 !! p는 분명히 필요하지 않지만, 아마도 이것을 분명히해야합니다. –

7

G 맨의 원래 댓글이 허용 대답해야한다 나는 일이 : 난 그냥 if (p)

점 뭐가 잘못 됐는지 궁금

은 다음과 같습니다 아무것도는 잘못 없다,이 은해야이 선호됩니다. 첫째로, !!p는 "너무 영리하다"; 그것은 또한 완전히 불필요하고 따라서 나쁘다. (예 : 여기서 우리는 if 진술의 포인터에 대해 이야기하고 있기 때문에, Anacrolix의 주석은 일반적으로 유효하지만 여기서는 적용되지 않는다!).

p != NULL에 대해서도 마찬가지입니다. 이것이 가능할 때까지는 필요하지 않습니다. 코드가 더 많아서 코드가 중복되어 코드이므로 코드가 악화됩니다. 제프 앳 우드 (Jeff Atwood)가 말한 가장 진실한 것은 "최상의 코드는 전혀 코드가 아닙니다"라는 것입니다. 중복 구문을 사용하지 마십시오. 최소한으로 충실하십시오 (여전히 완전한 의미를 전달합니다; if (p)입니다).

마지막으로 if (p)은 틀림없이 C++에서 이것을 작성하는 가장 관용적 인 방법입니다. C++은 언어의 다른 유형 (예 : 데이터 스트림)에 대해 이와 동일한 동작을 얻기 위해 거꾸로 뒤집으며, 매우 이상한 몇 가지 단점을 희생합니다. 다음 버전의 표준에서는 사용자 정의 유형에서이 동작을 구현하는 새로운 구문을 도입하기까지합니다.

포인터에 대해서는 무료입니다. 그래서 사용하십시오.

/편집 : 선명도 소개 : sharptooth는

IMO 널 포인터에 대해 비교가 명확 씁니다.

나는 이것이 객관적으로 잘못 되었음 : if (p)이 더 명확하다고 주장합니다. 이 문이이 문맥이나 다른 문맥에서 C++로 다른 것을 의미 할 수는 없습니다.

+0

나는 이것을 따른다. (p)가 모두 그것을 수행한다면, 짧지는 않은가? – stijn

+2

부울 유형에 if (x)를 지정하고 if (x! = nullptr/* 또는 NULL * /)로 예약하는 것을 더 선호합니다 (일부는 'NULL'을 사용하지 않는 추가 이점을 호출 할 수도 있습니다. 포인터 유형의 경우. 그렇게하면 포인터 검사가 코드에서 눈에 띄고 검색하기 쉽습니다. – Bill

+0

"이 문장이 다른 것을 의미 할 수있는 방법은 없습니다."- if (p! = NULL)이 NULL을 의미 할 수 있지만 p는 NULL과 같지 않을 수 있습니다. –

관련 문제