Легко видеть, что:
(i % 3 == 0) && (i % 5 == 0)
Можно упростить до:
(i % 15 == 0)
Однако глядя на вывод GCC, кажется, что это не делается даже при высоких уровнях оптимизации.
Делают ли какие-либо компиляторы такого рода оптимизации, или есть веская причина, по которой эти два теста семантически не эквивалентны?
Редактировать:В ответ на тех, кто говорит, что это второстепенный случай, ниже приведен аналогичный случай.:
(i < 3) && (i < 5)
Любое число меньше 3 всегда должно быть меньше 5. Второй тест является избыточным.
Я также хотел бы добавить следующее в ответ на ответ о том, что компилятор не может знать, затронута ли среда... Посмотрите на этот код:
void foo(void)
{
int i;
for (i = 0; i <= 10; i++)
{
if (i > 20)
{
puts("Hi");
}
}
}
Вся функция сокращена до "repz ret" GCC с -O2
. Это гораздо сложнее, чем все, о чем я говорю.