Toán tử nhân đôi không (!!) trong PHP


188

Toán tử kép không làm gì trong PHP?

Ví dụ:

return !! $row;

Các mã ở trên sẽ làm gì?


32
Điều này về cơ bản giống như làmreturn (bool) $row;
WildlyInacc chính xác

5
Tôi đã tự hỏi cái nào trong số chúng nhanh hơn và chúng tôi có (bool) là người chiến thắng. i.stack.imgur.com/dcnsM.png
Binod Kalathil

1
@Binod đó là một thông tin tốt đẹp, cảm ơn vì điều đó!
Robin K

Câu trả lời:


290

Đó không phải là "nhân đôi không phải toán tử", đó không phải là toán tử được áp dụng hai lần. Quyền !sẽ dẫn đến một boolean, bất kể toán hạng . Sau đó, bên trái !sẽ phủ nhận boolean đó.

Điều này có nghĩa là với bất kỳ giá trị thực nào (các số khác 0, các chuỗi và mảng không trống, v.v.), bạn sẽ nhận được giá trị boolean TRUEvà với bất kỳ giá trị sai nào (0, 0,0, NULLchuỗi rỗng hoặc mảng trống) bạn sẽ nhận được giá trị boolean FALSE.

Nó có chức năng tương đương với một diễn viên để boolean:

return (bool)$row;

22
"Double-not-Toán tử" hoặc "double not-Toán tử" .. phụ thuộc vào cách bạn đọc nó.
nickf

9
@nickf không thực sự, "nhân đôi không phải toán tử" chỉ một toán tử, không phải là hành động sử dụng toán tử không hai lần.
Theo

3
@Theo, thực ra là một nhà điều hành? Liệu thông dịch viên xem xét !!bằng (bool)trong trường hợp này? Hoặc mã máy khác nhau sẽ được chạy tùy thuộc vào cái nào được sử dụng?
Pacerier 30/03/2015

Điều này cũng hoạt động với JavaScript, đây là danh sách các giá trị giả cho Javascript và đây là danh sách các giá trị giả cho PHP
Jomar Sevillejo

1
Bạn có thể sử dụng nhiều như bạn muốn. Nếu có một số lẻ 'tiếng nổ' (dấu chấm than) thì đó sẽ là một hoạt động KHÔNG giống như !valuevà nếu có một số tiếng nổ chẵn thì nó sẽ giống như (bool) value.
diamondsea

51

Nó giống nhau (hoặc gần giống nhau - có thể có một số trường hợp góc) khi truyền sang bool. Nếu $rowsẽ đúc thành đúng, thì !! $rowcũng đúng.

Nhưng nếu bạn muốn đạt được (bool) $row, có lẽ bạn chỉ nên sử dụng điều đó - chứ không phải một số biểu thức "thú vị";)


2
Cảm ơn thực tế đó có ý nghĩa, tôi chưa bao giờ thấy một cái gì đó như thế này trong ngôn ngữ lập trình khác.
Andrei

16
Sử dụng !!là một thói quen còn lại từ lập trình trong C (++). Trong C, việc tạo diễn viên không dễ dàng như trong PHP, bạn có thể gặp nhiều vấn đề khác nhau, biên dịch các cảnh báo, vì vậy mọi người sẽ sử dụng boll bằng cách sử dụng !!.
NikiC

1
@nikic - Nghe có vẻ lạ, IMO ... vì operator!quá tải, sử dụng nó C++sẽ rất nguy hiểm. Ngoài ra, bạn không thể sử dụng cấu trúc trong C hoặc sử dụng !với chúng. Ngoài ra nếu một cái gì đó có thể bị phủ định, rất có thể bạn có thể trả lại nó từ một hàm trả về int, điều này khá nhiều làm cho nó trở thành một boolean. Bạn có chắc là bạn đang nói về C?
viraptor

2
Tôi đã từng thấy !! trong nhiều chương trình C dưới dạng chuyển đổi an toàn thành 1/0. (Vì boolean thực sự không là gì ngoài 0 / "non zero" trong C.)
Giáo sư Falken

1
@viraptor, !!không có gì "thú vị" như bạn tuyên bố. Nó ở khắp mọi nơi từ C đến JavaScript.
Pacerier 30/03/2015

18

Nó có nghĩa là nếu $rowcó một truthy giá trị, nó sẽ trở lại true, nếu không false, chuyển đổi một giá trị boolean.

Dưới đây là các biểu thức ví dụ để chuyển đổi boolean từ các tài liệu 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

"không phải không" là một cách thuận tiện trong nhiều ngôn ngữ để hiểu giá trị thật mà ngôn ngữ gán cho kết quả của bất kỳ biểu thức nào. Ví dụ: trong Python :

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

Nó có thể thuận tiện ở những nơi bạn muốn giảm một giá trị phức tạp xuống thành một cái gì đó như "có giá trị nào không?".


1

Một cách khác, có thể đơn giản hơn, cách 'đọc' không phải là:

  • Đầu tiên '!' thực hiện 2 điều: 'chuyển đổi' giá trị thành boolean, sau đó xuất ngược lại. Vì vậy, nó sẽ cho sự thật nếu giá trị là một 'giả'.

  • Thư hai '!' chỉ là để đầu ra ngược lại với đầu tiên.

Vì vậy, về cơ bản, giá trị đầu vào có thể là bất cứ thứ gì, có thể là một chuỗi, nhưng bạn muốn có đầu ra boolean, vì vậy hãy sử dụng '!' Đầu tiên. Tại thời điểm này, nếu bạn muốn TRUE khi giá trị đầu vào là 'giả mạo', thì hãy dừng ở đây và chỉ sử dụng một '!'; mặt khác, nếu bạn muốn TRUE khi giá trị đầu vào là 'trung thực', sau đó thêm một '!'.


0

Chúng ta hãy nhìn vào

!$a;

Thay vì diễn giải! toán tử như lấy

Boolean ngược lại với giá trị bên phải của nó

đọc

đưa Boolean đối diện với biểu thức sang phải

Trong trường hợp này

$a;

có thể là một biểu thức

vì vậy là

!$a;

cũng vậy

!!$a;

!!!$a;

và như vậy, vì mỗi trong số này là một biểu thức hợp lệ, các! toán tử có thể được chuẩn bị cho mỗi người trong số họ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.