비트가 아닌 부울 생각
요약하면, 교수의 솔루션은 비트 연산자 대신 부울 연산자를 사용하고 부울을 정수로 취급하기 때문에 더 좋습니다 (그러나 여전히 틀리고 엄격하게 말하면 아래를 참조하십시오). 표현은 c==1
"C에 해당하는"C는 (명시된 할당에 따라) 다수 일 수도이라면 (C)의 0이 아닌 값을 나타내는 것으로 간주하기 때문에 부정확 나타내는 true
.
안전한 경우에도 부울을 0 또는 1과 비교하지 않는 것이 좋은 이유에 대해서는 이 질문 을 참조하십시오 .
사용하지 않는 한 가지 좋은 이유 xor
는 이것이 비트 단위 배타적이거나 연산 이기 때문 입니다. 왼쪽과 오른쪽이 모두 1 또는 0으로 변환되는 부울 표현식이기 때문에 예제에서 작동합니다 (다시 1 참조 ).
부울 배타적이거나 실제로 !=
입니다.
표현 세분화
교수의 솔루션을 더 잘 이해하려면 부울 연산자를 "대체 토큰"으로 대체하는 것이 가장 쉽고, 이는 더 나은 redable (imho) 및 완전히 동등한 C ++ 코드로 바뀝니다. 'not'for '!' 그리고 '&&'에 대한 'and'
(not a and not b) != c
불행히도 exclusive_or
이외의 논리 연산자 not_eq
는 없습니다.이 경우에는 도움이되지 않습니다.
자연어 표현을 세분화하면 :
a와 b는 모두 false이거나 c는 true이지만 둘다는 아닙니다.
부울 제안 A와 B에 대한 문장으로 먼저 :
A 또는 B이지만 둘다는 아닙니다.
이것은 A != B
(A 및 B 유형이 아닌 부울에만 해당) 으로 변환됩니다 .
그런 다음 제안 A는
a와 b는 모두 거짓이다
이것은 다음과 같이 말할 수 있습니다
a는 거짓이고 b는 거짓
로 변환되고 (not a and not b)
마지막으로
c는 사실이다
간단히로 번역됩니다 c
. 그들을 결합하면 다시 얻을 수 있습니다 (not a and not b) != c
.
이 표현이 어떻게 작동하는지에 대한 자세한 설명을 위해, 나는 다른 사람들이 그들의 대답에 제시 한 진리표를 참조합니다.
둘 다 틀렸어
그리고 내가 nitpick 할 수 있다면 : 원래 과제는 a, b 및 c가 음수가 아닌 수라고 명시했지만 숫자라면 숫자 0과 1로 제한되어야한다고 분명하게 언급하지 않았습니다. true
관습 적으로 0 이 아닌를 나타내는 경우 다음 코드는 놀라운 대답을 산출합니다 .
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
대신 "A는 B 또는 C와 같음"을 번역하는 것입니다a == b or a ==c
. 음성 lanuage가 부정확 실제로 모두 해석이 유효 할 수 있다는 문제는