PHP에서 이중 (!!) 연산자


188

이중 not 연산자는 PHP에서 무엇을합니까?

예를 들면 다음과 같습니다.

return !! $row;

위의 코드는 무엇을합니까?


32
이것은 본질적으로하는 것과 동일합니다.return (bool) $row;
WildlyIncactate

5
나는 그들 중 어느 것이 더 빠른지 궁금했고 우리는 승자로 (bool) 있습니다. i.stack.imgur.com/dcnsM.png
Binod

1
@Binod 그것은 좋은 정보입니다. 감사합니다!
Robin K

답변:


291

"이중 연산자가 아님"이 아니라 연산자가 두 번 적용 되지 않습니다 . 오른쪽 !피연산자에 관계없이 부울이 됩니다. 그런 다음 왼쪽 !은 부울을 무효화합니다.

즉, 실제 값 (0이 아닌 숫자, 비어 있지 않은 문자열 및 배열 등의 숫자)의 경우 부울 값을 얻고 TRUE잘못된 값 (0, 0.0 NULL,, 빈 문자열 또는 빈 배열)의 경우 부울 값 FALSE.

다음과 같은 캐스트와 기능적으로 같습니다 boolean.

return (bool)$row;

22
"double-not-operator"또는 "double not-operator"는 읽는 방법에 따라 다릅니다.
nickf

9
@nickf는 실제로 "double not operator"는 not 연산자를 두 번 사용하는 행위가 아니라 하나의 연산자를 의미합니다.
Theo

3
@ Theo, 실제로 한 명의 운영자입니까? 이 경우 통역사가 !!동등한 것으로 간주합니까 (bool)? 또는 어떤 머신 코드가 사용되는지에 따라 다른 머신 코드가 실행됩니까?
Pacerier

이것은 JavaScript에서도 작동합니다. 다음은 Javascript잘못된 값
Jomar Sevillejo

1
원하는만큼 사용할 수 있습니다. 홀수 ( '느낌표') (느낌표)가 홀수 인 !value경우와 같은 연산이되지 않으며 짝수 (0)의 빅뱅이있는 경우와 같습니다 (bool) value.
diamondsea

51

bool로 캐스팅하는 것과 동일합니다 (또는 거의 동일합니다-코너 케이스가있을 수 있습니다). 경우 $row겠습니까 true로 캐스트, 다음 !! $row도 마찬가지입니다.

그러나 당신이 달성하기를 원한다면 (bool) $row, 아마도 "흥미로운"표현이 아닌 그냥 그저 사용해야 할 것입니다.)


2
실제로는 말이 되겠지만 다른 프로그래밍 언어에서는 이와 같은 것을 본 적이 없습니다.
Andrei

16
사용 !!은 C (++) 프로그래밍에서 남은 습관입니다. C에서는 캐스트를하는 것이 PHP만큼 쉽지는 않습니다. 많은 문제를 겪고 경고를 컴파일 할 수 있습니다 !!.
NikiC

1
@nikic-이상하게 들립니다. IMO ... operator!과부하가 걸리기 때문에 사용하면 C++위험합니다. 또한 C로 구조체를 캐스트하거나 !함께 사용할 수 없습니다 . 또한 무언가를 부정 할 수 있다면 int를 반환하는 함수에서 반환 할 가능성이 큽니다. 이는 거의 부울입니다. 당신은 C에 대해 이야기하고 있습니까?
viraptor

2
나는 보았다! 많은 C 프로그램에서 1/0으로 안전하게 변환합니다. (부울은 실제로 C에서 0 / "0이 아닌 것"에 지나지 않습니다.
Prof. Falken

1
@viraptor, !!당신이 주장한 것처럼 "흥미로운"것은 아닙니다. C에서 JavaScript까지 모든 곳에서 사용됩니다.
Pacerier

18

이 경우 의미 $row갖는다 truthy의 값을, 그 반환 true그렇지 false부울 값으로 변환.

다음은 PHP 문서에서 부울 변환에 대한 표현식 예입니다.

Expression             Boolean
$x = "";               FALSE
$x = null;             FALSE
var $x;                FALSE
$x is undefined        FALSE
$x = array();          FALSE
$x = array('a', 'b');  TRUE
$x = false;            FALSE
$x = true;             TRUE
$x = 1;                TRUE
$x = 42;               TRUE
$x = 0;                FALSE
$x = -1;               TRUE
$x = "1";              TRUE
$x = "0";              FALSE
$x = "-1";             TRUE
$x = "php";            TRUE
$x = "true";           TRUE
$x = "false";          TRUE

7

"not not"은 표현의 결과에 언어가 어떤 진실의 가치를 부여하는지 이해하기위한 많은 언어에서 편리한 방법입니다. 예를 들어, 파이썬에서 :

>>> not not []
False
>>> not not [False]
True

복잡한 값을 "값이 있습니까?"와 같은 수준으로 낮추려는 경우에 편리 할 수 ​​있습니다.


1

더 인간적인, 아마도 더 간단한, 읽을 수없는 방법 :

  • 첫번째 '!' 값을 부울로 '변환'한 다음 반대의 결과를 출력합니다. 따라서 값이 '거짓'인 경우 true를 제공합니다.

  • 두번째 '!' 첫 번째의 반대를 출력하는 것입니다.

따라서 기본적으로 입력 값은 문자열 일 수 있지만 부울 출력을 원하므로 첫 번째 '!'를 사용하십시오. 이 시점에서 입력 값이 'falsy'일 때 TRUE를 원하면 여기서 멈추고 단일 '!'을 사용하십시오. 그렇지 않으면 입력 값이 'truthy'일 때 TRUE를 원하면 다른 '!'를 추가하십시오.


0

보자

!$a;

해석하기보다는! 복용으로 연산자

오른쪽 값의 반대 부울

읽다

표현식의 반대 부울 을 오른쪽으로 가져갑니다.

이 경우

$a;

표현이 될 수있다

그래서

!$a;

너무

!!$a;

!!!$a;

등등, 이것들은 각각 유효한 표현이므로! 연산자는 그들 각각 앞에 붙일 수 있습니다.

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