'AND' vs '&&' sebagai operator

298

Saya memiliki basis kode tempat pengembang memutuskan untuk menggunakan ANDdan ORbukannya &&dan ||.

Saya tahu bahwa ada perbedaan dalam hal prioritas operator (lebih &&dulu and), tetapi dengan kerangka yang diberikan ( PrestaShop lebih tepatnya) jelas bukan alasan.

Versi mana yang Anda gunakan? Apakah andlebih mudah dibaca daripada &&? Atau tidak ada perbedaan?

ts.
sumber
1
Perhatikan bahwa ~operator bit-wise BUKAN dan bukan logis. ;-)
Gumbo
2
Ya saya tahu. Kebiasaan buruk :) . Agak aneh bahwa di PHP ada 'dan', 'atau' dan 'xor', tetapi tidak ada 'tidak', bukan?
ts.
1
@ts: jawaban yang benar di sini adalah jawaban yang diberikan oleh R. Bemrose stackoverflow.com/questions/2803321/and-vs-as-operator/…
Marco Demaio
4
! adalah operator logis bukan
Razor Storm
2
@chiliNUT benar sekali. Pada saat itu pasti masuk akal. Sepertinya jawaban yang salah mengintai telah dihukum pada titik ini :)
doublejosh

Jawaban:

664

Jika Anda menggunakan ANDdan OR, pada akhirnya Anda akan tersandung oleh sesuatu seperti ini:

$this_one = true;
$that = false;

$truthiness = $this_one and $that;

Ingin menebak apa yang $truthinesssetara?

Jika Anda mengatakan false... bzzzt, maaf, salah!

$truthinessdi atas memiliki nilai true. Mengapa? =memiliki prioritas lebih tinggi dari and. Penambahan tanda kurung untuk menunjukkan urutan tersirat membuat ini lebih jelas:

($truthiness = $this_one) and $that

Jika Anda menggunakan &&alih-alih anddalam contoh kode pertama, itu akan berfungsi seperti yang diharapkan dan menjadi false.

Sebagaimana dibahas dalam komentar di bawah, ini juga berfungsi untuk mendapatkan nilai yang benar, karena tanda kurung memiliki prioritas lebih tinggi daripada =:

$truthiness = ($this_one and $that)
Powerlord
sumber
135
+1: ini harus dibuat keras dan jelas dalam dokumentasi PHP, atau PHP harus berubah dan memberikan prioritas yang sama kepada operator ini atau MENGHAPUS and orsekali untuk semua. Saya melihat terlalu banyak orang berpikir mereka adalah hal yang persis sama dan jawaban di sini adalah lebih banyak kesaksian.
Marco Demaio
11
Sebenarnya, bahasa lain (misalnya, Perl dan Ruby) juga memiliki varian ini dengan perbedaan prioritas yang sama sehingga tidak masuk akal untuk menyimpang dari standar ini (betapapun membingungkannya bagi pemula) dengan membuat prioritas di PHP. Belum lagi kompatibilitas ke belakang dari banyak aplikasi PHP.
Mladen Jablanović
23
Ketidakmampuan orang untuk membaca dokumentasi untuk suatu bahasa tidak membuat keputusan bahasa salah. Seperti yang dicatat Mladen, Perl dan Ruby juga menggunakan operator tambahan ini, dan dengan prioritas yang sama. Hal ini memungkinkan untuk konstruksi seperti $foo and bar(), yang merupakan jalan pintas yang bagus untuk pernyataan if. Jika perilaku tak terduga (dari dokumentasi yang buruk, atau tidak membacanya) adalah alasan untuk tidak menggunakan sesuatu yang kita tidak akan berbicara tentang menggunakan PHP sama sekali.
Altreus
2
Saya menghabiskan 3 menit untuk menemukan garis yang salah: $ this = true , :( dan bagaimana dengan $ truthiness = ($ this dan $ that); ini terlihat lebih baik untuk saya :)
Dmitriy Kozmenko
6
Saya setuju dengan Dmitriy - membungkus evaluasi boolean dalam tanda kurung membantu untuk memperjelas maksud kode. Saya pikir operator dan fungsinya karena sekarang ada bernilai dan konsisten dengan bahasa lain, itu tugas programmer untuk memahami bahasa.
Jon z
43

Bergantung pada bagaimana itu digunakan, itu mungkin perlu dan bahkan berguna. http://php.net/manual/en/language.operators.logical.php

// "||" has a greater precedence than "or"

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;

Tetapi dalam kebanyakan kasus sepertinya lebih dari rasa pengembang, seperti setiap kejadian ini yang saya lihat dalam kerangka CodeIgniter seperti @Sarfraz telah disebutkan.

adamJLev
sumber
2
Perlu dicatat bahwa "benar" tidak diabaikan jika ungkapan itu adalah bagian dari pernyataan yang lebih besar. Pertimbangkan kasus if ($f = false or true) $f = true;- hasilnya akan $fmenjadi benar pada akhirnya, karena ekspresi dievaluasi sebagai benar secara keseluruhan.
Chris Browne
1
tidak, Anda cukup menimpa variabel nanti. ekspresi masih dievaluasi menjadi false, lalu Anda menimpanya dengan true di baris berikutnya.
r3wt
2
Sebenarnya, dia benar. Pertama, $fakan diberikan false - tetapi kondisi bernilai true, maka $fditimpa. Jika kondisi dievaluasi salah, $ftidak akan pernah ditimpa dengan cara lain.
ahouse101
Sangat konyol untuk menyarankan pengembang harus mengikuti selera mereka sendiri. Lupakan mimpi buruk pengembang lain mencoba untuk menjaga kode yang sama, pengembang yang menulis kode itu sendiri akan membuat kesalahan semantik dalam setiap kode yang ditulis karena s / ia lebih suka andlebih &&, di mana andkarya-karya seperti yang diharapkan hanya beberapa situasi dan &&bekerja seperti yang diharapkan di semua situasi.
ADTC
13

Demi keamanan, saya selalu mengurung perbandingan saya dan menghapusnya. Dengan begitu, saya tidak harus bergantung pada prioritas operator:

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )
Kapten Kenpachi
sumber
29
Secara pribadi saya pikir menambahkan tanda kurung tambahan yang tidak perlu membuatnya lebih membingungkan untuk dibaca daripada hanya memiliki apa yang Anda butuhkan. Sebagai contoh, saya pikir ini jauh lebih mudah dibaca: if (($ i == 0 && $ b == 2) || ($ c == 3 && $ f! = 5))
rooby
4
Saya pikir ini adalah kode yang paling cantik yang pernah saya lihat sepanjang hari. Kerja bagus.
rm-vanda
Karena PHP adalah bahasa yang ditafsirkan, ia akan berjalan cepat jika Anda tidak menggunakan spasi putih atau baris baru yang tidak perlu pada kode Anda. Jika Anda melakukan hal yang sama pada bahasa yang dikompilasi, itu hanya akan membutuhkan waktu lebih lama untuk dikompilasi tetapi tidak akan berpengaruh pada runtime. Saya tidak bermaksud melakukannya sekali akan menandai perbedaan tetapi pada seluruh aplikasi menggunakan php + javascript keduanya menulis seperti contoh ... kali memuat akan lebih besar pasti. Penjelasan: Ruang putih dan baris baru diabaikan, tetapi untuk mengabaikannya, mereka harus diperiksa. Ini terjadi saat runtime pada langs yang diinterpretasikan dan ketika dikompilasi pada yang dikompilasi.
JoelBonetR
@ JoelBonetR jika Anda menggunakan php opcache atau yang serupa dengan Anda tentang waktu buka tidak relevan. Saya harap tidak ada yang menjalankan situs produksi php tanpanya ...
PeloNZ
@PeloNZ sehingga Anda dapat menulis kotor karena itu akan di-cache pula dan seluruh proyek hanya akan memakan waktu satu detik lagi untuk memuat ketika menyegarkan, ya? Membersihkan kode adalah untuk Anda sendiri dan rekan satu tim Anda, menyangkut soal waktu hanyalah titik yang diabaikan sebagian besar orang atau tidak diketahui.
JoelBonetR
11

Precedence berbeda antara && dan dan (&& memiliki prioritas lebih tinggi dari dan), sesuatu yang menyebabkan kebingungan ketika dikombinasikan dengan operator ternary. Misalnya,

$predA && $predB ? "foo" : "bar"

akan mengembalikan string yang sementara

$predA and $predB ? "foo" : "bar"

akan mengembalikan boolean .

arviman
sumber
10

Karena andmemiliki prioritas lebih rendah daripada =Anda dapat menggunakannya dalam penetapan kondisi:

if ($var = true && false) // Compare true with false and assign to $var
if ($var = true and false) // Assign true to $var and compare $var to false
Justinas
sumber
2

Izinkan saya menjelaskan perbedaan antara "dan" - "&&" - "&".

"&&" dan "dan" keduanya adalah operasi DAN logis dan mereka melakukan hal yang sama, tetapi diutamakan operator berbeda.

Diutamakan (prioritas) dari operator menentukan bagaimana "erat" itu mengikat dua ekspresi bersama. Misalnya, dalam ekspresi 1 + 5 * 3, jawabannya adalah 16 dan bukan 18 karena operator perkalian ("*") memiliki prioritas lebih tinggi daripada operator penambahan ("+").

Menggabungkannya bersama dalam satu operasi, bisa memberi Anda hasil yang tidak terduga dalam beberapa kasus saya sarankan selalu menggunakan &&, tapi itu pilihan Anda.


Di sisi lain "&" adalah operasi DAN bitwise . Ini digunakan untuk evaluasi dan manipulasi bit tertentu dalam nilai integer.

Contoh jika Anda melakukannya (14 & 7) hasilnya adalah 6.

7   = 0111
14  = 1110
------------
    = 0110 == 6
Mahmoud Zalt
sumber
1

versi mana yang Anda gunakan?

Jika standar pengkodean untuk basis kode tertentu saya menulis kode untuk menentukan operator mana yang harus digunakan, saya pasti akan menggunakannya. Jika tidak, dan kode menentukan yang harus digunakan (tidak sering, dapat dengan mudah dikerjakan) maka saya akan menggunakannya. Kalau tidak, mungkin && .

Apakah 'dan' lebih mudah dibaca daripada '&&'?

Apakah lebih mudah dibaca oleh Anda . Jawabannya adalah ya dan tidak tergantung pada banyak faktor termasuk kode di sekitar operator dan memang orang yang membacanya!

|| ada ~ perbedaan?

Iya. Lihat operator logis untuk ||dan operator bitwise untuk ~.

salathe
sumber
0

Saya kira ini masalah selera, meskipun (keliru) mencampurkannya dapat menyebabkan beberapa perilaku yang tidak diinginkan:

true && false || false; // returns false

true and false || false; // returns true

Karenanya, menggunakan && dan || lebih aman karena mereka memiliki prioritas tertinggi. Dalam hal keterbacaan, saya akan mengatakan operator ini cukup universal.

PEMBARUAN : Tentang komentar yang mengatakan bahwa kedua operasi mengembalikan false ... well, sebenarnya kode di atas tidak mengembalikan apa pun, saya minta maaf atas ambiguitasnya. Untuk mengklarifikasi: perilaku dalam kasus kedua tergantung pada bagaimana hasil operasi digunakan. Amati bagaimana prioritas operator mulai berlaku di sini:

var_dump(true and false || false); // bool(false)

$a = true and false || false; var_dump($a); // bool(true)

Alasan mengapa $a === trueadalah karena operator penugasan lebih diutamakan daripada operator logis, seperti yang sudah dijelaskan dengan sangat baik dalam jawaban lain.

nuqqsa
sumber
16
Ini tidak benar, mereka semua kembali salah.
Jay
0

Berikut ini contoh contohnya:

$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);

keluaran:

bool(false)

Saya akan mengatakan kesalahan ketik semacam ini jauh lebih mungkin menyebabkan masalah berbahaya (dalam banyak cara yang sama seperti =vs ==) dan jauh lebih kecil kemungkinannya untuk diperhatikan daripada adn/ rokesalahan ketik yang akan ditandai sebagai kesalahan sintaksis. Saya juga menemukan dan / atau lebih mudah dibaca. FWIW, sebagian besar kerangka kerja PHP yang menyatakan preferensi (kebanyakan tidak) menentukan dan / atau. Saya juga tidak pernah menemukan kasus nyata yang tidak dibuat-buat di mana itu akan menjadi masalah.

Sinkron
sumber
0

Contoh bagus lainnya menggunakan ifpernyataan tanpa =operasi penugasan.

if (true || true && false); // is the same as:
if (true || (true && false)); // TRUE

dan

if (true || true AND false); // is the same as:
if ((true || true) && false); // FALSE

karena ANDmemiliki prioritas yang lebih rendah dan dengan demikian ||prioritas yang lebih tinggi.

Ini berbeda dalam kasus true, false, falsedan true, true, false. Lihat https://ideone.com/lsqovs untuk contoh terperinci.

Ken
sumber