문제

이 질문은 관련이 있지만 동일하지는 않습니다. 이 하나.]

특정 유형의 값을 부울 표현으로 사용하려고하면 경고를받습니다. 나는 경고를 억제하기보다는 때때로 3 원 운영자를 사용합니다 (?:) bool로 변환합니다. 두 사람이 아닌 연산자 사용 (!!) 똑같은 일을하는 것 같습니다.

내가 의미하는 바는 다음과 같습니다.

typedef long T;       // similar warning with void * or double
T t = 0;
bool b = t;           // performance warning: forcing 'long' value to 'bool'
b = t ? true : false; // ok
b = !!t;              // any different?

그렇다면 이중 정지 기술이 실제로 똑같은 일을합니까? Ternary 기술보다 더 안전합니까? 이 기술은 비 통신 유형으로 똑같이 안전합니까 (예 : void * 또는 double ~을 위한 T)?

나는 묻지 않는다 !!t 좋은 스타일입니다. 나는 그것이 의미 적으로 다른지 묻습니다 t ? true : false.

도움이 되었습니까?

해결책

의 논쟁! 조작자와 3 원 운영자의 첫 번째 논쟁은 모두 암시 적으로 Bool로 변환됩니다. 그리고? : 캐스트의 imo 바보 같은 중복 장식입니다. 나는 투표한다

b = (t != 0);

암시 적 변환이 없습니다.

다른 팁

또는이를 수행 할 수 있습니다. bool b = (t != 0)

주의 깊은!

  • 부울은 진실과 허위에 관한 것입니다.
  • 정수는 정수에 관한 것입니다.

그것들은 매우 뚜렷한 개념입니다.

  • 진실과 거짓은 물건을 결정하는 것입니다.
  • 숫자는 물건을 세는 것입니다.

이러한 개념을 연결할 때는 명시 적으로 수행해야합니다. 나는 Dima의 버전을 가장 좋아합니다.

b = (t != 0);

그 코드는 분명히 말합니다. 두 숫자를 비교하고 진실 가치를 부울에 저장하십시오.

모든 유효한 기술은 모두 동일한 코드를 생성합니다.

개인적으로, 나는 가장 깨끗한 구문을 사용할 수 있도록 경고를 비활성화합니다. 부울에 던지는 것은 실수로 걱정하는 것이 아닙니다.


예, 안전합니다.


0은 거짓으로 해석되며 다른 모든 것은 사실입니다.
따라서! 5는 거짓으로 나옵니다
! 0은 사실처럼 나옵니다
그래서 !! 5는 사실처럼 나옵니다

나는 사용하지 않을 것이다 :

bool b = !!t;

그것은 가장 읽기 쉬운 방법입니다 (따라서 유지하기가 가장 어렵습니다)

다른 사람들은 상황에 달려 있습니다.
부울 표현식으로 만 사용하도록 변환하는 경우.

bool b = t ? true : false;
if (b)
{
    doSomething();
}

그런 다음 언어가 당신을 위해 그것을하도록 할 것입니다.

if (t)
{
    doSomething();
}

실제로 부울 가치를 저장하는 경우. 그런 다음 먼저 캐스트가 필요한 첫 번째 장소에서 왜 오래 걸 었는지 궁금합니다. 길고 부울 값이 필요하다고 가정하면 상황에 따라 다음을 모두 고려할 것입니다.

bool  b = t ? true : false;      // Short and too the point.
                                 // But not everybody groks this especially beginners.
bool  b = (t != 0);              // Gives the exact meaning of what you want to do.
bool  b = static_cast<bool>(t);  // Implies that t has no semantic meaning
                                 // except as a bool in this context.

요약 : 당신이있는 맥락에서 가장 의미를 제공하는 것을 사용하십시오.
당신이 무엇을하고 있는지 분명하게 만들어보십시오

나는 그 경고를 억제하지 말고 AC 캐스트 (bool)를 사용하여 그것을 억제하지 않는 것이 좋습니다. 전환이 항상 당신이 가정하는대로 호출되는 것은 아닙니다.

True로 평가하는 표현과 그 값의 부울 사이에는 차이가 있습니다.

둘 다 !! 그리고 Ternary는 익숙해 지지만, 비슷하게 업무를 수행 할 것입니다. 비슷하게 작업을 수행 할 것입니다.

Dima의 접근 방식은 표현의 값을 부울에 할당하기 때문에 괜찮습니다.

경고가 걱정된다면 캐스트를 강요 할 수도 있습니다. bool b = (bool)t;

난 정말 싫어 !! t !!!!!!. 그것은 C와 C ++에 대해 최악의 상황을 겪고 있습니다. 유혹은 구문으로 너무 영리합니다.

bool b (t! = 0); // IMHO의 가장 좋은 방법입니다. 무슨 일이 일어나고 있는지 명시 적으로 보여줍니다.

!! 작을 수 있지만 불필요하게 복잡하다고 생각합니다. 제 생각에는 경고를 비활성화하거나 3 원 운영자를 사용하는 것이 좋습니다.

나는 b = (0! = t)를 사용합니다. 적어도 어떤 제정신은 쉽게 읽을 수 있습니다. 코드에서 Double Dang이 보이면 거의 놀랄 것입니다.

경고를 비활성화합니다.

명확성을 위해 먼저 쓰십시오. 그런 다음 프로필; 그런 다음 필요한 경우 속도를 최적화하십시오.

!! 산술 방식으로 부울 표현을 사용할 때만 유용합니다.

c = 3 + !!extra; //3 or 4

(누구의 스타일은 다른 토론입니다.) 필요한 모든 것이 부울 표현 뿐이라면 !! 중복됩니다. 글쓰기

bool b = !!extra;

다음과 같이 의미가 있습니다.

if (!!extra) { ... }

0과 비교하는 것은 잘 작동하지 않습니다. 돌아온다 - 왜 !! vs. Ternary?

class foo { public: explicit operator bool () ; };

foo f;

auto a = f != 0; // invalid operands to binary expression ('foo' and 'int')
auto b = f ? true : false; // ok
auto c = !!f; // ok

사용하는 것이 좋습니다

if (x! = 0)

또는

if (x! = null)

if (x) 대신; 더 이해하기 쉽고 읽을 수 있습니다.

Double은 나에게 웃기지 않으며 디버그 코드에서 최적화 된 코드와는 매우 다릅니다.

당신이 사랑에 빠졌다면 !! 당신은 항상 그것을 매크로 할 수 있습니다.

#define LONGTOBOOL(x) (!!(x))

(제쳐두고, 3 원 운영자는이 경우 내가 선호하는 것입니다)

나는 bool b = t를 사용 하고이 특정 라인의 안전에 대해 주석으로 컴파일 경고를 남겨 둡니다. 경고를 비활성화하면 코드의 다른 부분에서 엉덩이에 물릴 수 있습니다.

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