Каждый программист должен знать, что:
В некоторых случаях, чтобы оптимизировать программу, может случиться, что компилятор изменяет (!p && !q) на (!(p || q)).
Два выражения эквивалентны, и нет никакой разницы в оценке первой или второй. 
Но в С++ можно перегрузить операторы, и перегруженный оператор может не всегда уважать это свойство. Таким образом, преобразование кода таким образом фактически изменит код.
Должен ли компилятор использовать законы Де Моргана, когда !, || и && перегружены?

