Pikirkan booleans, bukan bit
Singkatnya, solusi profesor Anda lebih baik (tetapi masih salah, secara tegas, lihat lebih jauh ke bawah) karena menggunakan operator boolean, bukan operator bitwise dan memperlakukan boolean sebagai bilangan bulat. Ungkapan c==1
untuk mewakili "c benar" salah karena jika c dapat berupa angka (sesuai dengan penugasan yang dinyatakan) maka nilai bukan-nol dari c dianggap dianggap mewakili true
.
Lihat pertanyaan ini tentang mengapa lebih baik tidak membandingkan boolean dengan 0 atau 1, bahkan ketika itu aman untuk dilakukan.
Satu alasan yang sangat bagus untuk tidak digunakan xor
adalah karena ini adalah operasi atau bit-wise . Ini terjadi pada contoh Anda karena sisi kiri dan kanan adalah ekspresi boolean yang dikonversi menjadi 1 atau 0 (lihat lagi 1 ).
Boolean eksklusif-atau sebenarnya !=
.
Memecah ekspresi
Untuk memahami solusi profesor Anda dengan lebih baik, lebih mudah untuk mengganti operator boolean dengan padanan "alternatif token" mereka, yang mengubahnya menjadi lebih baik dapat dirubah (imho) dan kode C ++ yang sepenuhnya setara: Menggunakan 'bukan' untuk '!' dan 'dan' untuk '&&' Anda dapatkan
(not a and not b) != c
Sayangnya, tidak ada exclusive_or
operator logis selain not_eq
, yang tidak membantu dalam kasus ini.
Jika kita memecah ekspresi bahasa alami:
Baik a dan b keduanya salah atau c benar, tetapi tidak keduanya.
pertama menjadi kalimat tentang proposisi boolean A dan B:
Baik A atau B, tetapi tidak keduanya.
ini diterjemahkan menjadi A != B
(hanya untuk boolean, bukan untuk tipe A dan B).
Kemudian proposisi A adalah
a dan b keduanya salah
yang dapat dinyatakan sebagai
a salah dan b salah
yang diterjemahkan menjadi (not a and not b)
, dan akhirnya
c benar
Yang diterjemahkan menjadi c
. Menggabungkan mereka, Anda dapatkan lagi (not a and not b) != c
.
Untuk penjelasan lebih lanjut bagaimana ungkapan ini kemudian bekerja, saya tunduk pada tabel kebenaran yang telah diberikan orang lain dalam jawaban mereka.
Anda berdua salah
Dan jika saya dapat melakukan nitpick: Tugas asli menyatakan bahwa a, b dan c dapat berupa angka-angka yang tidak negatif, tetapi tidak secara jelas menyatakan bahwa jika itu adalah angka, angka-angka tersebut harus dibatasi dengan nilai 0 dan 1. Jika ada angka yang bukan 0 mewakili true
, seperti kebiasaan, maka kode berikut akan menghasilkan jawaban yang mengejutkan :
auto c = 2; // "true" in some way
auto a = 0; // "false"
auto b = 0; // "false"
std::cout << ((!a && !b) != c);
// this will output: 1 (!)
// fix by making sure that != compares booleans:
std::cout << ((!a && !b) != (bool)c);
a == b or c
bukana == b or a ==c
. Masalahnya adalah bahwa bahasa yang diucapkan tidak tepat dan sebenarnya kedua interpretasi tersebut dapat valid