Современные компиляторы шибко умные, могут посчитать на этапе компиляции, если есть возможность. Интересно, осилит посчитать isOdd(1)? Даже интересно стало, надо попробовать. А вдруг задымится и бабахнет? UPD: GCC мегакрут: bool isOdd(int n)
{
if (n == 2147483647)
{
return true;
}
else if (n == 0)
{
return false;
}
else
{
return isOdd(n += 2);
}
}
void test(void)
{
static int volatile i;
i = isOdd(2);
}
test.c: In function 'test':
test.c:42:25: warning: variable 'i' set but not used [-Wunused-but-set-variable]
static int volatile i;
^
test.c: In function 'test':
test.c:34:16: warning: iteration 1073741822 invokes undefined behavior [-Waggressive-loop-optimizations]
return isOdd(n += 2);
^
test.c:28:13: note: within this loop
else if (n == 0)
Вот это вот 'undefined behavior' заменяет на 'while (1);'.
Ну и isOdd(1) таки считает на этапе компиляции.