다음 코드에서 (p != NULL)
대신 (!!p)
을 사용하면 어떤 이점이 있습니까?이유/(p! = NULL) 대신 (!! p)
AClass *p = getInstanceOfAClass();
if(!!p)
// do something
else
// do something without having valid pointer
다음 코드에서 (p != NULL)
대신 (!!p)
을 사용하면 어떤 이점이 있습니까?이유/(p! = NULL) 대신 (!! p)
AClass *p = getInstanceOfAClass();
if(!!p)
// do something
else
// do something without having valid pointer
사실 그건 스타일의 문제입니다. 자세한 내용은 this very similar question을 참조하십시오.
null 포인터와 비교하여 IMO가 더 명확합니다.
는 최대한 멀리 볼 수있는, 그것은 부울 값으로 변환하는 단지 짧은 방법입니다. 그것은! 두 번이지만, p != NULL
은 하나의 비교를 수행합니다. 따라서 !!p
이 무엇을 의미하는지 알지 못한다면 이점은 더 짧은 코드 일 것입니다.
그들은 동일하지만, 나는 그것은 더 읽을 수
NULL != p
사용하는 것이 좋습니다.
그건 개인적인 취향과 스타일에 불과합니다. –
가독성은 논쟁의 여지가 있습니다. 개인적으로는 자연스럽게 읽을 수 없기 때문에 읽기 쉽지 않습니다. 나는 보통 'p가 NULL이 아니라면' 'NULL이 p가 아닌 경우'라고 말합니다. –
예. 컴파일러가 "NULL = p"를 가져올 때 잘못된 "p = NULL"을 누락하는 것을 방지합니다. – ChrisBD
주어진 예제에는 차이가 없습니다.
이 모든 경우에 적용되는 가정이 잘못 그러나
. A = B 하지 아니 정수 타입 우려까지와 같이 A = B 동일하지 않다.C에서 0
은 거짓입니다. 0
이외의 항목은 모두 true입니다. 그러나 not 0
은 1
이며 다른 것은 없습니다. C++에서 true는 1
으로 정수로 변환됩니다. 1
은 0
이 아니며 및 BOOL
을 포함하여 C 불 유형에서 true를 나타내는 데 가장 많이 사용되는 값입니다. Win32. 결과가 예상 정수 값에 논리 값을 캐스팅 할 목적으로 !!
의 사용을 배제하지 않는 if
상태의 평가에 대한 bool
으로 캐스팅되어 있기 때문에
주어진 예제 코드 동안, !!p
는 불필요합니다. 이 예에서 개인적으로 유형 변경 및 의미가 명확 할 확률을 최대화하기 위해 의미가 무엇인지 명확히하기 위해 NULL != p
또는 p != NULL
을 사용합니다.
이 기술은 double-bang 관용구로 알려져 있으며 this guy provides some good justifications입니다.
이 경우 이러한 정렬은 유효하지 않습니다. –
실제로이 문맥에서 (p)와 if (!! p) *가 동일하면. 이것은 if의 조건이 bool로 변환되어 테스트 되었기 때문입니다. 이는 정확히 무엇입니까 !! 결국. 다시 링크 된 대답, C++에서 커널 놈들은 bool에 값을 던질 수있었습니다. –
"예제 코드에서는 !! p는 분명히 필요하지 않지만, 아마도 이것을 분명히해야합니다. –
G 맨의 원래 댓글이 허용 대답해야한다 나는 일이 : 난 그냥 if (p)
점 뭐가 잘못 됐는지 궁금
은 다음과 같습니다 아무것도는 잘못 없다,이 은해야이 선호됩니다. 첫째로,
!!p
는 "너무 영리하다"; 그것은 또한 완전히 불필요하고 따라서 나쁘다. (예 : 여기서 우리는if
진술의 포인터에 대해 이야기하고 있기 때문에, Anacrolix의 주석은 일반적으로 유효하지만 여기서는 적용되지 않는다!).
p != NULL
에 대해서도 마찬가지입니다. 이것이 가능할 때까지는 필요하지 않습니다. 코드가 더 많아서 코드가 중복되어 코드이므로 코드가 악화됩니다. 제프 앳 우드 (Jeff Atwood)가 말한 가장 진실한 것은 "최상의 코드는 전혀 코드가 아닙니다"라는 것입니다. 중복 구문을 사용하지 마십시오. 최소한으로 충실하십시오 (여전히 완전한 의미를 전달합니다;if (p)
은입니다).마지막으로
if (p)
은 틀림없이 C++에서 이것을 작성하는 가장 관용적 인 방법입니다. C++은 언어의 다른 유형 (예 : 데이터 스트림)에 대해 이와 동일한 동작을 얻기 위해 거꾸로 뒤집으며, 매우 이상한 몇 가지 단점을 희생합니다. 다음 버전의 표준에서는 사용자 정의 유형에서이 동작을 구현하는 새로운 구문을 도입하기까지합니다.포인터에 대해서는 무료입니다. 그래서 사용하십시오.
/편집 : 선명도 소개 : sharptooth는
IMO 널 포인터에 대해 비교가 명확 씁니다.
나는 이것이 객관적으로 잘못 되었음 :
if (p)
이 더 명확하다고 주장합니다. 이 문이이 문맥이나 다른 문맥에서 C++로 다른 것을 의미 할 수는 없습니다.
나는 이것을 따른다. (p)가 모두 그것을 수행한다면, 짧지는 않은가? – stijn
부울 유형에 if (x)를 지정하고 if (x! = nullptr/* 또는 NULL * /)로 예약하는 것을 더 선호합니다 (일부는 'NULL'을 사용하지 않는 추가 이점을 호출 할 수도 있습니다. 포인터 유형의 경우. 그렇게하면 포인터 검사가 코드에서 눈에 띄고 검색하기 쉽습니다. – Bill
"이 문장이 다른 것을 의미 할 수있는 방법은 없습니다."- if (p! = NULL)이 NULL을 의미 할 수 있지만 p는 NULL과 같지 않을 수 있습니다. –
'if (p)'가 무엇이 잘못되었는지 궁금합니다. – GManNickG
절대적으로 아무것도. :) – Twisol
운영자에게 과부하가 걸린 경우 항상 의심해야합니다. '! p' 나'! ='는 특별한 행동을 취하는 것이 가능합니다. – Kobi