Bitleri değil, booleanları düşünün
Özetle, profesörünüzün çözümü daha iyidir (ama yine de yanlıştır, kesinlikle konuşursak, aşağıya bakın) çünkü bitsel operatörler yerine boole işleçlerini kullanır ve boole'lara tamsayı olarak davranır. c==1
"C true" yu temsil eden ifade yanlıştır, çünkü c bir sayı olabilirse (belirtilen atamaya göre), sıfır olmayan herhangi bir c değeri temsil edici olarak kabul edilecektir true
.
Bunu yapmak güvenli olsa bile boolean'ları 0 veya 1 ile karşılaştırmamanın daha iyi olduğu konusunda bu soruya bakın .
Kullanmamanın çok iyi bir nedeni xor
, bunun biraz akıllıca özel veya operasyon olmasıdır. Örneğinizde işe yarar çünkü hem sol hem de sağ taraf 1 veya 0'a dönüşen boole ifadeleridir (tekrar 1'e bakın ).
Boole münhasır - ya da aslında !=
.
İfadeyi yıkmak
Profesörünüzün çözümünü daha iyi anlamak için, boole operatörlerini "alternatif jeton" eşdeğerleriyle değiştirmek en kolay yoldur, bu da onu daha iyi yeniden yazılabilir (imho) ve tamamen eşdeğer C ++ koduna dönüştürür: ve 've' için '&&' alırsınız
(not a and not b) != c
Ne yazık ki, bu durumda yardımcı olmayan exclusive_or
başka bir mantıksal operatör yoktur not_eq
.
Doğal dil ifadesini yıkarsak:
A ve b'nin ikisi de yanlıştır veya c doğrudur, ancak ikisi de değildir.
ilk olarak Boole önermeleri A ve B hakkında bir cümleye:
Ya A ya da B, ama ikisi de değil.
bu A != B
(sadece boolean'lar için, herhangi bir A ve B tipi için değil) anlamına gelir.
Sonra A önerisi
a ve b'nin ikisi de yanlış
olarak ifade edilebilir
a yanlış ve b yanlış
içine çevirir (not a and not b)
ve nihayet
c doğrudur
Hangi basitçe çevirir c
. Onları birleştirdiğinizde tekrar elde edersiniz (not a and not b) != c
.
Bu ifadenin nasıl işlediğine dair daha fazla açıklama için, başkalarının cevaplarında verdiği doğruluk tablolarını erteliyorum.
İkiniz de yanılıyorsunuz
Ve eğer nitpick yapabilirsem: Orijinal atama, a, b ve c'nin negatif olmayan sayılar olabileceğini, ancak sayılar olsaydı, 0 ve 1 değerleri ile sınırlı olması gerektiğini açıkça belirtmediğini belirtti. 0 değil true
, alışılmış olduğu gibi, aşağıdaki kod şaşırtıcı bir cevap verecektir :
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
yerine çevirmektira == b or a ==c
. Sorun, konuşulan