#include <iostream>
//#define BAD
void test(int x)
{
#ifdef BAD
static int y = x;
#else
static int y;
y = x;
#endif
std::cout << y << " ";
if (!y)
std::cout << std::endl;
else
test(x - 1);
}
int main()
{
test(20);
return 0;
}
Если в этой программе раскомментировать #define BAD, то она зацикливается и завершается Segmentation fault (видимо, переполняется стек). Компилировал я это g++ (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21). Почему так различается поведение программы при казалось бы незначительном изменении? И вообще, соответствует ли такое поведение стандарту?
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Да такое поведение полностью соответствует стандарту!!!
Учите матчасть про статические переменные!
static int y = x; - выполняется ТОЛЬКО 1 раз при инициализации и всегда у вас равно 20, а вот x... постоянно уменьшается...
и ваше условие if (!y)
не выполняется никогда!!!
Далее вы уходите в бесконечную рекурсию пока не падаете тут
#0 0xb7d761ce in _IO_file_xsputn () from /lib/i686/cmov/libc.so.6
#1 0xb7d6c76f in fwrite () from /lib/i686/cmov/libc.so.6
#2 0xb7f17026 in ?? () from /usr/lib/libstdc++.so.6
#3 0xb7f0a943 in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long> () from /usr/lib/libstdc++.so.6
#4 0xb7f0aa8d in std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put () from /usr/lib/libstdc++.so.6
#5 0xb7f1b5b0 in std::ostream::_M_insert<long> () from /usr/lib/libstdc++.so.6
#6 0xb7f1b724 in std::ostream::operator<< () from /usr/lib/libstdc++.so.6
#7 0x08048990 in test (x=-524089) at test.cpp:13
#8 0x080489cd in test (x=-524088) at test.cpp:17
#9 0x080489cd in test (x=-524087) at test.cpp:17
#10 0x080489cd in test (x=-524086) at test.cpp:17
#11 0x080489cd in test (x=-524085) at test.cpp:17
#12 0x080489cd in test (x=-524084) at test.cpp:17
#13 0x080489cd in test (x=-524083) at test.cpp:17
#14 0x080489cd in test (x=-524082) at test.cpp:17
(Это back trace отладчика gdb при просмотре коры (core dump) вашей упавшей по сегфолу программы)
Судя по посту вы с ним не знакомы.
Познакомьтесь.
Очень рекомендую и на такие грабли больше не наступите.
Да, и еще подучите с/с++, чтоб о стандартах меньше вопросов было.