문제

다음 코드에서 사용의 이점은 무엇입니까? (!!p) 대신에 (p != NULL)?

AClass *p = getInstanceOfAClass();
if( !!p )
  // do something
else 
  // do something without having valid pointer
도움이 되었습니까?

해결책

그것은 스타일의 문제입니다. 사실 그들은 동등합니다. 보다 이 매우 비슷한 질문 토론을 위해.

NULL 포인터와 비교하는 IMO는 명확합니다.

다른 팁

나는 거의 동일하지만 !!p 나쁜 스타일이 되려면 일반적으로 코더가 영리하려고하는 코더를 나타냅니다.

나는 Gman의 원래 의견이 받아 들여진 대답이어야합니다.

나는 그냥 무엇이 잘못되었는지 궁금합니다 if (p)

요점의 요점은 다음과 같습니다. 아무것도 아님 그것에 문제가 있습니다 ~해야 한다 선호하는 방법이 되십시오. 우선, !!p “너무 영리합니다”; 그것은 또한 완전히 불필요하고 나쁘다 (주목 : 우리는 포인터에 대해 이야기하고 있습니다. if 여기서 진술, 따라서 Anacrolix의 의견은 일반적으로 유효하지만 여기에는 적용되지 않습니다!).

마찬가지입니다 p != NULL. 이것은 가능하지만 필요하지 않습니다. 더 많은 코드입니다 불필요한 코드는 코드를 악화시킵니다. Jeff Atwood가 말한 가장 진실한 것은“최고의 코드는 코드가 전혀 없다”는 것입니다. 중복 구문을 피하십시오. 최소값을 고수하십시오 (여전히 완전한 의미를 전달합니다. if (p) ~이다 완벽한).

드디어, if (p) C ++로 이것을 작성하는 가장 관용적 인 방법 일 것입니다. C ++는 매우 이상한 단점의 비용으로 언어 (예 : 데이터 스트림)의 다른 유형에 대해 동일한 동작을 얻기 위해 뒤로 구부립니다. 표준의 다음 버전은 사용자 정의 유형 에서이 동작을 달성하기 위해 새로운 A 구문을 도입합니다.

포인터의 경우, 우리는 무료로 동일하게 얻습니다. 그러니 사용하십시오.

/편집 : 명확성에 대해 : Sharptooth는 다음을 씁니다

NULL 포인터와 비교하는 IMO는 명확합니다.

나는 이것이 객관적으로 잘못되었다고 주장한다. if (p) 명확합니다. 이 진술이 C ++ 에서이 문맥이나 다른 것을 의미 할 수있는 방법은 없습니다.

내가 볼 수있는 한, 부울 가치로 변환하는 것은 짧은 방법 일뿐입니다. 그것은 적용됩니다! 그러나 두 번 p != NULL 하나의 비교를합니다. 그래서 나는 당신이 무엇을 모른다면 더 비밀 스럽지만 혜택은 단지 더 짧은 코드라고 생각합니다. !!p 의미가 있습니다.

그들은 동일하지만 사용하는 것이 좋습니다.

NULL != p

더 읽기 쉽습니다.

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

그러나 이것이 모든 경우에 적용된다는 가정이 잘못되었습니다. a = 아님 b 동일하지 않습니다 a = b, 정수 유형에 관한 한.

C, 0 거짓입니다. 뭐든지 0 사실이다. 하지만 not 0 ~이다 1, 그리고 다른 것은 없습니다. C ++에서는 진정한 캐스트가 있습니다 1 정수로서, C와의 후진 호환뿐만 아니라 1 아니다 0, 그리고 1 C BOOL 유형에서 True를 나타내는 데 사용되는 가장 일반적인 값은 공식 C BOOL 유형, 그리고 BOOL Win32에서 사용됩니다.

주어진 예제 코드를 위해 !!p 결과가 a로 캐스트되기 때문에 불필요합니다 bool 평가를 위해 if 조건, 사용을 배제하지 않습니다 !! 부울을 예상 정수 값으로 캐스팅 할 목적으로. 개인적 으로이 예에서는 유형 변화와 의미론이 명확 할 확률을 최대화하기 위해 NULL != p 또는 p != NULL 의미하는 바를 절대적으로 명확하게하기 위해.

이 기술은 더블 월 관용구로 알려져 있으며 이 사람은 좋은 정당화를 제공합니다.

이중 부정을 사용하지 마십시오. 간단한 주장은 C ++가 제한된 영어 서브 세트이고 영어는 이중 부정을 가지고 있지 않기 때문에 영어를 말하는 사람은 진행중인 일을 구문 분석하는 데 많은 어려움이 있다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top