&& dan || bukan operator logis tetapi kondisional?

62

Saya agak bingung dengan dokumentasi C # MSDN yang menyatakan itu &dan |operator logis dan bahwa &&dan ||adalah operator bersyarat.

Saya terus menelepon &&, ||dan !operator logis, jadi saya salah?

John V
sumber
4
Tampaknya memang tidak logis, tetapi ada perbedaan penting antara kedua kelas, dan sangat penting bagi Anda untuk tidak berasumsi bahwa, katakanlah, |dapat dipertukarkan dengan ||, meskipun dalam banyak kasus mereka dapat dipertukarkan tanpa perubahan nyata dalam perilaku program.
Daniel R Hicks

Jawaban:

120

Saya agak bingung dengan dokumentasi C # MSDN yang menyatakan itu &dan |operator logis dan bahwa &&dan ||adalah operator bersyarat. Saya terus menelepon &&, ||dan !operator logis, jadi saya salah?

Tidak; kamu benar.

Ada banyak kesalahan nomenklatur kecil, sebagian besar tidak penting dalam dokumentasi MSDN; Saya mencoba mengeluarkan sebanyak mungkin dari mereka, tetapi dalam kasus-kasus yang tidak salah dan menyesatkan, itu tidak selalu merupakan penggunaan waktu yang bijak. Pergi ke spesifikasi jika Anda ingin pernyataan definitif tentang nama fitur C #.

Jadi: otoritas yang relevan adalah spesifikasi C #, yang menyatakan dalam bagian 7.11:

The &, ^dan |operator disebut operator logika.

Kemudian melanjutkan untuk memecah lebih lanjut operator logis built-in menjadi integer, enumerasi, Boolean dan operator logika nullable-Boolean. Ada juga operator logis yang ditentukan pengguna; lihat spesifikasi untuk detailnya.

Di bagian 7.12 yang kita miliki

The &&dan ||operator disebut operator logika kondisional. Mereka juga disebut operator logika "hubungan arus pendek".

Jadi semuanya adalah operator yang logis . Beberapa dari mereka adalah operator logis bersyarat .

Apa yang membuat operator logika kondisional bersyarat ? Orang mungkin membuat dugaan yang salah bahwa itu karena mereka biasanya digunakan dalam pernyataan kondisional ( if) atau ekspresi kondisional ( ? :). Alasan sebenarnya diberikan oleh spesifikasi:

The &&dan ||operator versi bersyarat dari &dan |operator: Operasi x && ysesuai dengan operasi x & y, kecuali bahwa ydievaluasi hanya jika xtidak salah. Operasi x || ysesuai dengan operasi x | y, kecuali yang ydievaluasi hanya jika xtidak benar.

Operator logika kondisional dinamai demikian karena operan tangan kanan dievaluasi secara kondisional tergantung pada nilai operan tangan kiri.

Kita dapat melihat ini lebih jelas dengan mencatat bahwa operator logika kondisional hanyalah "gula sintaksis" untuk ekspresi kondisional . x && yadalah cara menulis yang lebih menyenangkan x ? y : false, dan cara menulis x || yyang lebih menyenangkan x ? true : y. Ekspresi logis bersyarat sebenarnya adalah ekspresi kondisional.

Ada juga bentuk operator logis bersyarat yang ditentukan pengguna, dan sedikit rumit. Lihat spesifikasi untuk detailnya.

Bacaan lebih lanjut, jika subjek ini menarik minat Anda:

Eric Lippert
sumber
3
@RobertHarvey: Benar, fakta bahwa & dapat beroperasi pada bools, tipe integer atau tipe enum tetapi && hanya beroperasi pada bools tidak ada hubungannya dengan pilihan untuk menamai salah satu dari mereka bentuk "kondisional" dari operator. Operator kondisional adalah kondisional karena memiliki cabang kondisional dalam semantik evaluasinya.
Eric Lippert
16
Saya mendapat kesan istilah "operator hubung singkat" jauh lebih populer (dan mungkin kurang ambigus) daripada "operator kondisional" dalam arti yang dijelaskan.
Doc Brown
15
@DocBrown: Ini pasti populer, tetapi saya selalu menemukan nama itu menyesatkan; tampaknya telah diciptakan oleh seseorang yang berpikir bahwa "hubungan pendek" dan "jalan pintas" untuk mendapatkan hasil adalah hal yang sama. Hubung singkat adalah gangguan berbahaya yang dapat dengan cepat menghancurkan sistem listrik. Kami menamai blok "tidak aman" di C # "tidak aman" karena berbahaya jika digunakan secara tidak benar ; jangan memberikan hal-hal yang imut tapi menyesatkan yang mengandung nilai. Bahkan jangan membuat saya memulai pada operator Elvis. :-)
Eric Lippert
26
@EricLippert: Walaupun "korsleting" mungkin terdengar menakutkan bagi masyarakat umum, saya tidak berpikir K&R bingung tentang definisi sebenarnya. Dalam teknik listrik, korsleting sirkuit tidak selalu merupakan kesalahan yang berbahaya, bahkan kita melakukannya dengan sengaja setiap saat. Ini hanya berarti memotong bagian yang tidak diinginkan dari rangkaian dengan memberikan jalur yang lebih pendek untuk diikuti.
hackerb9
1
@CortAmmon: Anda akan ingin membaca paragraf berikut ini di mana saya berseru bahwa semantik operator yang ditentukan pengguna sedikit berbeda dan Anda harus melihat spesifikasi untuk detailnya.
Eric Lippert
27

Dalam C # ini semua adalah operator logis.

int x = 0xABCD & 0xFF // x == 0xCD

&&dan ||disebut " operator logis bersyarat " karena mereka mengalami hubungan arus pendek.

bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated, 
                                     // because x == 0xEF is false

Perhatikan bahwa terminologi ini berbeda dari bahasa ke bahasa. Di C dan C ++ &&dan ||hanya Operator Logis. Di Jawa, &dan |disebut Operator Bitwise , sedangkan C dan C ++ mengklasifikasikan mereka sebagai Operator Aritmatika .

Robert Harvey
sumber
3
Ya, Microsoft adalah otoritas, tetapi dokumen yang berwenang adalah spesifikasinya. Lihat bagian 7.12, Operator Logika Bersyarat .
Eric Lippert
8
Moral dari cerita ini adalah: lebih penting untuk memahami dengan tepat apa yang dilakukan para operator ini daripada tepatnya tentang nama mereka.
Robert Harvey
21
Fokus pada apa yang dilakukan operator, dan berhenti terobsesi dengan kosa kata. Lihat juga Penamaan yang Dianggap Berbahaya .
Robert Harvey
4
+1. Segala sesuatu yang tercantum dalam pertanyaan hanyalah operator yang mengambil satu atau dua ekspresi dan mengevaluasi suatu nilai. Kata sifat tidak perlu membelah rambut.
Blrfl
3
@RobertHarvey Esai “Dianggap Berbahaya” Dianggap Berbahaya
user11153
-2

Intinya adalah bahwa &dan |merupakan operator bitwise , artinya mereka diterapkan dan menghasilkan nilai string bit. Dan bitwise adalah istilah yang sangat digunakan di kalangan programmer.

Misalnya 0xff & 0x00 == 0x00, sementara 0xff | 0x00 == 0xff.

Dan &&dan ||diterapkan pada kondisi, dan menghasilkan nilai kondisi yang biasa; yaitu truedan false.

Misalnya true && false == false, sementara true || false == true.

Oleh karena itu &&dan ||bisa disebut operator kondisional , meskipun itu bukan istilah yang biasa di kalangan programmer.

Tentu saja, setiap programmer C, C ++, Java dan C # mengetahui semua itu. Tapi saya kira kesalahpahaman itu terjadi karena "operator kondisional" bukan istilah yang sering digunakan oleh kami programmer.

Hilton Fernandes
sumber
5
Tentu saja, setiap programmer C, C ++, Java dan C # mengetahui semua itu. Itu hal yang sangat kasar untuk ditulis, menyiratkan OP itu bodoh. Sama dengan menulis kami programmer , Anda mengecualikan OP. Tolong jangan lakukan itu.
DarkDust
1
Saya tidak berpikir bahwa jawaban Anda nanti membawa nilai tambah setelah jawaban Eric Lippert diterima, dan lebih jauh lagi salah dalam arti tidak memahami inti pertanyaan.
Honza Zidek
@DarkDust Setiap programmer C, C ++, Java dan C # harus memahami operator tersebut. Ini tidak kasar tetapi fakta .
Phil1970
1
@ Phil1970: OP tampaknya memahami operator ini, ini tentang klarifikasi penamaan . Dalam hal ini, dan telah menekankan istilah-istilah yang relevan dalam jawaban Hilton, kalimatnya itu dapat diartikan sebagai makna setiap programmer tahu tentang rincian penamaan ini, tetapi Anda tidak . Ini adalah salah (seperti dapat dilihat dalam diskusi dari jawaban yang lain) dan ungkapan yang kasar.
DarkDust
4
Dear all, saya minta maaf jika jawaban saya terlihat kasar. Bahasa Inggris bukan bahasa pertama. Bagaimanapun, saya tidak pernah bermaksud untuk menyatakan bahwa OP bukan seorang programmer. Au contraire, maksud saya dia bingung dengan penamaan yang tidak biasa dalam teks yang dia baca. Semua yang saya coba lakukan adalah mengklarifikasi penamaan yang tidak biasa oleh fragmen program.
Hilton Fernandes