Apa perbedaan antara & dan && di MATLAB?

Jawaban:

93

Satu ampersand & adalah operator AND yang logis. Tanda ampersand ganda && sekali lagi merupakan operator logika AND yang menggunakan perilaku hubungan arus pendek. Korsleting berarti operan kedua (sisi kanan) dievaluasi hanya jika hasilnya tidak sepenuhnya ditentukan oleh operan pertama (sisi kiri)

A & B (A dan B dievaluasi)

A && B (B hanya dievaluasi jika A benar)

Fraser
sumber
75
Peringatan: &dapat beroperasi pada array tetapi &&hanya dapat beroperasi pada skalar.
gnovice
Catatan sampingan: setelah 15 tahun bekerja dengan Matlab hampir setiap hari saya selalu menggunakan '&' dan itu tidak pernah menggigit saya di pantat. OTOH, saya tahu banyak orang yang merasa kesal menggunakan '&&' karena mereka harus ingat itu tidak universal (ya saya menyadari bahwa '&' tidak seefisien karena tidak korsleting tetapi saya hampir tidak pernah daisy- rantai operan saya sehingga penghematan saat ini dapat diabaikan).
eric
7
@neuronet ini bukan tentang efisiensi, lebih dari itu mengizinkan konstruksi di mana ekspresi pertama menjamin kondisi yang tanpanya ekspresi kedua dapat menyebabkan kesalahan run-time. misalnya d != 0 && 1/dvs d !=0 & 1/d- jaminan pertama tidak ada pembagian dengan nol, yang kedua tidak.
Fraser
2
Jawaban ini tidak lengkap dan tidak akurat. &melakukan hubungan pendek jika dalam sebuah ifpernyataan. Dan &&mengambil input skalar. @ Jawaban Loren di bawah ini benar.
Cris Luengo
2
Perhatikan juga bahwa Loren adalah karyawan MathWorks. Jawaban tidak lebih otoritatif dari itu. Jika Anda bersedia berkorban, Anda dapat menandai jawaban Anda untuk sebuah mod untuk menghapusnya (Anda tidak dapat menghapusnya sendiri, karena itu diterima). Anda akan mempertahankan reputasi yang Anda peroleh darinya (jika saya memahami sistem dengan benar), dan kami akan mendapatkan jawaban teratas yang benar secara teknis dan berwibawa.
Andras Deak
35

&&dan selalu ||ambil masukan skalar dan korsleting. |dan &mengambil input array dan hubung singkat hanya di pernyataan if / while. Untuk tugas, yang terakhir tidak melakukan hubungan arus pendek.

Lihat halaman dokumen ini untuk informasi lebih lanjut.

Loren
sumber
1
Apakah Anda memiliki informasi tentang pintasan versi Matlab &dan |pernyataan if / while? Tampaknya tidak demikian halnya di R2012b dan R2014a.
Tim
@Loren tahu mengapa mereka merancang satu untuk bekerja dengan skalar saja? Tampaknya aneh ...
eric
@ Neuronet: Anda tidak dapat melakukan hubungan pendek jika Anda beroperasi pada array.
Cris Luengo
17

Seperti yang telah disebutkan oleh orang lain, &adalah operator AND yang logis dan &&merupakan operator AND hubung singkat . Mereka berbeda dalam bagaimana operan dievaluasi serta apakah beroperasi pada array atau skalar:

  • &(Operator AND) dan |(operator OR) dapat beroperasi pada array dengan cara yang bijaksana.
  • &&dan ||merupakan versi hubung singkat yang operan kedua dievaluasi hanya jika hasilnya tidak sepenuhnya ditentukan oleh operan pertama. Ini hanya dapat beroperasi pada skalar , bukan array.
gnovice
sumber
8

Keduanya adalah operasi AND yang logis. && adalah operator "arus pendek". Dari dokumen MATLAB:

Mereka adalah operator hubung singkat karena mengevaluasi operan kedua mereka hanya jika hasilnya tidak sepenuhnya ditentukan oleh operan pertama.

Lihat selengkapnya di sini .

Menandai
sumber
6

Mirip dengan bahasa lain, &adalah operator bitwise logis, sedangkan &&operasi logis.

Misalnya (maafkan sintaks saya).

Jika..

A = [True True False True]
B = False
A & B = [False False False False]

..atau..

B = True
A & B = [True True False True]

Sebab &&, operan kanan hanya dihitung jika operan kiri benar, dan hasilnya adalah nilai boolean tunggal.

x = (b ~= 0) && (a/b > 18.5)

Harapan itu jelas.

Erik Kerber
sumber
3
Ini tidak bitwise, itu elemen-bijaksana.
Cris Luengo
3
Apakah saya baru sembuh 10 tahun kemudian? 😺
Erik Kerber
Nah, pertanyaan ini telah dilihat ~ 115k dilihat sejauh ini, yang berarti banyak orang telah membaca informasi yang salah di sini. Banyak dari jawaban ini tidak lengkap atau mengandung informasi yang salah. Yang perlu Anda lakukan hanyalah memperbaiki jawaban Anda atau menghapusnya. BTW: bitandadalah logika AND operator bitwise di MATLAB.
Cris Luengo
2

Aturan praktis yang baik saat menyusun argumen untuk digunakan dalam pernyataan bersyarat (IF, WHILE, dll.) Adalah selalu menggunakan && / || formulir, kecuali ada alasan yang sangat bagus untuk tidak melakukannya. Ada dua alasan ...

  1. Seperti yang telah disebutkan orang lain, perilaku hubungan arus pendek && / || mirip dengan kebanyakan bahasa mirip C. Kesamaan / keakraban itu umumnya dianggap sebagai poin yang menguntungkannya.
  2. Menggunakan && atau || formulir memaksa Anda untuk menulis kode lengkap untuk memutuskan maksud Anda untuk argumen vektor. Ketika a = [1 0 0 1] dan b = [0 1 0 1], apakah a & b benar atau salah? Saya tidak dapat mengingat aturan untuk MATLAB &, bukan? Kebanyakan orang tidak bisa. Sebaliknya, jika Anda menggunakan && atau ||, Anda DIPAKSA untuk menulis kode "secara lengkap" untuk mengatasi kondisi tersebut.

Melakukan ini, daripada mengandalkan resolusi vektor MATLAB di & dan |, mengarah ke kode yang sedikit lebih bertele-tele, tetapi BANYAK lebih aman dan lebih mudah untuk dipelihara.

Bob Gilmore
sumber
1
+1, tetapi perlu diperhatikan bahwa jawaban Anda hanya berlaku untuk kasus di mana Anda ingin hasil akhir operasi menjadi skalar. Ada banyak kegunaan untuk & dan | di mana && dan || tidak berguna karena mereka tidak dapat mengembalikan array, misalnya saat melakukan pengindeksan mewah seperti "memilih semua r antara 1 dan 2: r((r<2)&(r<2))".
Jonas Heidelberg
Poin yang bagus, Jonas. Saya sedang memikirkan kondisional, bukan "pengindeksan logis", (istilah MATLAB untuk "pengindeksan mewah" yang Anda sebutkan) ketika saya menulis ini. Saya mengubah kalimat pertama posting saya untuk mencerminkan itu. Terima kasih atas pengingatnya!
Bob Gilmore