bezmyślnie pisałem jakiś kod, aby sprawdzić, czy wszystkie wartości struct były ustawione na 0. Aby to osiągnąć użyłem:wartości Chaining Bool dać skutek odwrotny do oczekiwanego
bool IsValid() {
return !(0 == year == month == day == hour == minute == second);
}
gdzie wszyscy członkowie struct były typu Niepodpisany krótki. Użyłem kodu jako części większego testu, ale zauważyłem, że zwracano wartość false w przypadku wartości różniących się od zera, i prawdziwe w przypadku wartości, które były wszystkie równe zeru - przeciwieństwo tego, czego się spodziewałem.
Zmieniłem kod do odczytu:
bool IsValid() {
return (0 != year) || (0 != month) || (0 != day) || (0 != hour) || (0 != minute) || (0 != second);
}
Ale chciałbym wiedzieć, co spowodowało dziwne zachowanie. Czy to wynik precedensu? Próbowałem użyć tej odpowiedzi, ale nic nie znalazłem, jeśli jest jakaś nomenklatura do opisania wyniku, który chciałbym poznać.
Skompilowałem kod przy użyciu VS9 i VS8.
Nieświadomie natknąłeś się na integralne zasady promocji. Bool może być promowany na liczbę całkowitą, więc test 'bool == int' jest ważny ... nawet jeśli jest wyjątkowo sprzeczny z intuicją. Ach! –
Jako notatkę "a == b == c == d == 0" działałoby na Pythonie. – liori