Sebagai tindak lanjut dari pertanyaan saya sebelumnya (memang mengesampingkan operator == untuk kelas secara otomatis mengesampingkan operator! =), Apakah ada skenario, di mana Anda akan mengganti operator == dan! =

c++
6
rabl 6 April 2021, 01:32

3 jawaban

Jawaban Terbaik

Tidak, dalam arti luas. Stepanov akan mengatakan bahwa jika Anda tidak mengikuti aturan logika ini maka Anda mendapatkan apa yang pantas Anda dapatkan. Itu sebabnya dalam C ++ 20 mereka akan didefinisikan secara default satu sama lain seperti yang dia inginkan.

Dalam praktiknya, ya, setidaknya ada dua skenario.

  1. Nan (bukan-A-angka) dalam nomor IEEE Floating Point. Dua Nan berbeda dan tidak sama pada saat yang sama.

Seperti disebutkan dalam komentar. Inkonsistensi logis tidak persis antara == dan !=, tetapi terkait: Anda dapat melakukan a = b; assert( a != b); atau memiliki assert( a != a ).


  1. Ekspresi konstruksi, templat ekspresi alias, alias dsl. == dan! = Buat dua ekspresi independen. Secara logis, mereka harus tetap berlawanan tetapi tidak dalam arti bahwa mereka adalah nilai Boolean sederhana. Lihatlah boost.phoenix atau boost.spirit. Perpustakaan ini tidak akan mungkin terjadi jika pasukan bahasa mengembalikan bool untuk operasi ini dan satu sebagai negatif dari yang lain.

Dalam kedua kasus Anda dapat menafsirkan kembali situasi untuk "memulihkan" aturan logis. Misalnya 1) Anda dapat mengatakan bahwa setelah ada nan di sistem Anda, program ini tidak dalam kondisi logis lagi. 2) Anda dapat mengatakan bahwa "ekspresi" a! = B harus juga dihasilkan oleh! (A == b) bahkan jika mereka tidak segera bool.

Jadi, bahkan jika bahasa mari kita tidak bermain dengan aturan logika.

Ada juga mitos yang kadang-kadang dicoba untuk memeriksa ketidaksetaraan harus lebih cepat daripada memeriksa kesetaraan atau vise versa, sebagai alasan untuk mengimplementasikannya secara terpisah yang dapat menyebabkan inkonsistensi logis. Ini omong kosong mengingat korsleting operasi logis yang mendasar ke C ++ dan harus dari sistem apa pun yang dibangun di atas C ++.

1
alfC 6 April 2021, 00:41

Setiap skenario di mana orang memutuskan untuk menggunakan === (triple sama) operator untuk memeriksa kesetaraan menunjukkan bahwa jika Anda berasumsi

(!(a === b)) == (a != b)

Kemudian == Anda bukan negasi !=.

Catatan: Sebelum Anda downvote, saya tidak menyiratkan bahwa ada operator === di C ++! Saya menggambarkan skenario, seperti yang ditanyakan dalam pertanyaan.

-4
Vlad Feinstein 6 April 2021, 00:50

Ini terjadi sepanjang waktu ketika bekerja dengan database, di mana nilai NULL gagal setiap perbandingan.

Jadi, jika Anda menerapkan objek yang memodelkan data yang berasal dari database, dan Anda memiliki objek yang mewakili nilai NULL, membandingkan sesuatu untuk kesetaraan dengan nilai NULL akan salah. Membandingkannya untuk ketidaksetaraan dengan nilai NULL juga akan salah. Setiap jenis perbandingan akan salah. Dan, icing pada kue: membandingkan nilai NULL untuk kesetaraan dengan nilai NULL lainnya juga salah.

1
Sam Varshavchik 5 April 2021, 23:01