Ini pada dasarnya sama dengan melakukanreturn (bool) $row;
WildlyInaccurate
5
Saya bertanya-tanya siapa di antara mereka yang lebih cepat dan kami memiliki (bool) sebagai pemenang. i.stack.imgur.com/dcnsM.png
Binod Kalathil
1
@Binod itu info yang bagus, terima kasih untuk itu!
Robin K
Jawaban:
291
Ini bukan "bukan operator ganda", itu bukan operator yang diterapkan dua kali. Hak !akan menghasilkan boolean, terlepas dari operan . Maka kiri !akan meniadakan boolean itu.
Ini berarti bahwa untuk setiap nilai sebenarnya (angka selain nol, string dan array yang tidak kosong, dll.) Anda akan mendapatkan nilai boolean TRUE, dan untuk nilai salah apa pun (0, 0,0, NULLstring kosong atau array kosong) Anda akan mendapatkan nilai boolean FALSE.
Secara fungsional ini setara dengan gips untuk boolean:
"double-not-operator" atau "double not-operator" .. tergantung bagaimana Anda membacanya.
nickf
9
@nickf tidak juga, "operator ganda bukan" mengacu pada satu operator, bukan tindakan menggunakan operator tidak dua kali.
Theo
3
@Theo, Ini sebenarnya satu operator? Apakah penerjemah menganggap !!sama (bool)dalam hal ini? Atau apakah kode mesin yang berbeda dijalankan tergantung mana yang digunakan?
Anda dapat menggunakan sebanyak yang Anda inginkan. Jika ada jumlah ganjil 'poni' (tanda seru) itu akan menjadi TIDAK operasi yang sama dengan !value, dan jika ada jumlah ganjil poni itu akan sama dengan (bool) value.
diamondsea
51
Itu sama (atau hampir sama - mungkin ada beberapa kasus sudut) seperti casting ke bool. Jika $rowingin dilemparkan ke true, maka !! $rowitu juga benar
Tetapi jika Anda ingin mencapai (bool) $row, Anda mungkin harus menggunakan itu - dan bukan ekspresi "menarik";)
Terima kasih itu benar-benar masuk akal, saya tidak pernah melihat sesuatu seperti ini dalam bahasa pemrograman lain.
Andrei
16
Menggunakan !!adalah kebiasaan yang tersisa dari pemrograman dalam C (++). Dalam C melakukan pemeran tidak semudah di PHP, Anda bisa mendapatkan banyak masalah yang berbeda, kompilasi peringatan, dan sebagainya. Jadi, orang-orang menggunakan boll !!.
NikiC
1
@nikic - Kedengarannya aneh, IMO ... karena operator!kelebihan muatan, menggunakannya C++akan berbahaya. Anda juga tidak dapat menggunakan struct di C, atau menggunakannya !. Juga jika sesuatu dapat dinegasikan, Anda kemungkinan besar dapat mengembalikannya dari fungsi pengembalian int, yang cukup banyak membuatnya menjadi boolean. Apakah Anda yakin sedang berbicara tentang C?
viraptor
2
Saya sudah melihat !! dalam banyak program C sebagai konversi aman ke 1/0. (Karena boolean benar-benar tidak lain adalah 0 / "bukan nol" dalam C.)
Prof. Falken
1
@ Viraptor, !!tidak ada yang "menarik" seperti yang Anda klaim. Itu semua tempat dari C ke JavaScript.
Pacerier
18
Itu berarti jika $rowmemiliki nilai kebenaran , itu akan mengembalikan true, jika tidak false, mengkonversi ke nilai boolean.
Berikut adalah contoh ekspresi konversi boolean dari php docs.
"tidak tidak" adalah cara yang mudah dalam banyak bahasa untuk memahami nilai kebenaran apa yang diberikan oleh bahasa pada hasil dari ekspresi apa pun. Misalnya, dalam Python :
>>>notnot[]False>>>notnot[False]True
Itu bisa nyaman di tempat-tempat di mana Anda ingin mengurangi nilai yang kompleks hingga sesuatu seperti "apakah ada nilai sama sekali?".
Cara lain yang lebih manusiawi, mungkin lebih sederhana, untuk 'membaca' yang tidak tidak:
Pertama '!' melakukan 2 hal: 'mengubah' nilai menjadi boolean, lalu menampilkan kebalikannya. Jadi itu akan menjadi kenyataan jika nilainya 'salah'.
Kedua '!' hanya untuk menghasilkan kebalikan dari yang pertama.
Jadi, pada dasarnya, nilai input bisa berupa apa saja, mungkin sebuah string, tetapi Anda menginginkan output boolean, jadi gunakan yang pertama '!'. Pada titik ini, jika Anda ingin TRUE ketika nilai input 'falsy', maka berhenti di sini dan cukup gunakan satu '!'; jika tidak, jika Anda ingin BENAR ketika nilai input 'benar', lalu tambahkan yang lain '!'.
return (bool) $row;
Jawaban:
Ini bukan "bukan operator ganda", itu bukan operator yang diterapkan dua kali. Hak
!
akan menghasilkan boolean, terlepas dari operan . Maka kiri!
akan meniadakan boolean itu.Ini berarti bahwa untuk setiap nilai sebenarnya (angka selain nol, string dan array yang tidak kosong, dll.) Anda akan mendapatkan nilai boolean
TRUE
, dan untuk nilai salah apa pun (0, 0,0,NULL
string kosong atau array kosong) Anda akan mendapatkan nilai booleanFALSE
.Secara fungsional ini setara dengan gips untuk
boolean
:sumber
!!
sama(bool)
dalam hal ini? Atau apakah kode mesin yang berbeda dijalankan tergantung mana yang digunakan?!value
, dan jika ada jumlah ganjil poni itu akan sama dengan(bool) value
.Itu sama (atau hampir sama - mungkin ada beberapa kasus sudut) seperti casting ke bool. Jika
$row
ingin dilemparkan ke true, maka!! $row
itu juga benarTetapi jika Anda ingin mencapai
(bool) $row
, Anda mungkin harus menggunakan itu - dan bukan ekspresi "menarik";)sumber
!!
adalah kebiasaan yang tersisa dari pemrograman dalam C (++). Dalam C melakukan pemeran tidak semudah di PHP, Anda bisa mendapatkan banyak masalah yang berbeda, kompilasi peringatan, dan sebagainya. Jadi, orang-orang menggunakan boll!!
.operator!
kelebihan muatan, menggunakannyaC++
akan berbahaya. Anda juga tidak dapat menggunakan struct di C, atau menggunakannya!
. Juga jika sesuatu dapat dinegasikan, Anda kemungkinan besar dapat mengembalikannya dari fungsi pengembalian int, yang cukup banyak membuatnya menjadi boolean. Apakah Anda yakin sedang berbicara tentang C?!!
tidak ada yang "menarik" seperti yang Anda klaim. Itu semua tempat dari C ke JavaScript.Itu berarti jika
$row
memiliki nilai kebenaran , itu akan mengembalikantrue
, jika tidakfalse
, mengkonversi ke nilai boolean.Berikut adalah contoh ekspresi konversi boolean dari php docs.
sumber
"tidak tidak" adalah cara yang mudah dalam banyak bahasa untuk memahami nilai kebenaran apa yang diberikan oleh bahasa pada hasil dari ekspresi apa pun. Misalnya, dalam Python :
Itu bisa nyaman di tempat-tempat di mana Anda ingin mengurangi nilai yang kompleks hingga sesuatu seperti "apakah ada nilai sama sekali?".
sumber
Cara lain yang lebih manusiawi, mungkin lebih sederhana, untuk 'membaca' yang tidak tidak:
Pertama '!' melakukan 2 hal: 'mengubah' nilai menjadi boolean, lalu menampilkan kebalikannya. Jadi itu akan menjadi kenyataan jika nilainya 'salah'.
Kedua '!' hanya untuk menghasilkan kebalikan dari yang pertama.
Jadi, pada dasarnya, nilai input bisa berupa apa saja, mungkin sebuah string, tetapi Anda menginginkan output boolean, jadi gunakan yang pertama '!'. Pada titik ini, jika Anda ingin TRUE ketika nilai input 'falsy', maka berhenti di sini dan cukup gunakan satu '!'; jika tidak, jika Anda ingin BENAR ketika nilai input 'benar', lalu tambahkan yang lain '!'.
sumber
Mari lihat
Alih-alih menafsirkan! operator seperti mengambil
Kebalikan dari nilai Boolean di sebelah kanannya
Baca
ambil kebalikan dari ekspresi Boolean di sebelah kanannya
Pada kasus ini
bisa menjadi ekspresi
jadi begitu
begitu juga
dan
dan seterusnya, karena masing-masing adalah ekspresi yang valid, the! Operator dapat ditambahkan ke masing-masing.
sumber