@aschepler: Даже если это не ответ, интересно знать, что такие ошибки могут оставаться в вашем коде в течение десятилетия !! ... и с этой точки зрения, это ценный пост для этой темы. Кроме того, нет никакого ответа, кроме того, что это UB, который, кажется, даже этот ответ говорит.
л §3.9.1 / 6 из стандарта C ++ гласит:
Значения типа bool либоtrue
или жеfalse
.
Теперь рассмотрим этот код,
void f(bool b)
{
switch(b) //since b is bool, it's value can be either true or false!
{
case true: cout << "possible value - true"; break;
case false: cout << "possible value - false"; break;
default: cout << "impossible value";
}
}
int main()
{
bool b; //note : b is uninitialized
f(b);
return 0;
}
компилироватьF:\workplace>g++ test.cpp -pedantic
Запустить. Выход :
невозможное значение
Неожиданный вывод? Ну, не совсем, поскольку Стандарт гласит в сноске § 3.9.1 / 6, что:
Использование значения bool способами, описанными в этом международном стандарте как«Неопределенный» такие какизучая ценность неинициализированного автоматический объект, может вызвать еговести себя так, как будто это не правда и не ложь.
Поэтому независимо от того, сколько раз я компилирую и запускаю эту программу, я получаю один и тот же вывод:impossible value
, Однако, если я немного его поменяю - уберу функциюf()
с картинки, и напишитеswitch
блокировать вmain()
сам:
int main()
{
bool b; //note : b is uninitialized
switch(b) //since b is bool, it's value can be either true or false!
{
case true: cout << "possible value - true"; break;
case false: cout << "possible value - false"; break;
default: cout << "impossible value";
}
return 0;
}
Затем я компилирую и запускаю эту программу, я не получаюimpossible value
как вывод; независимо от того, сколько раз я повторяю это, я никогда не получаюimpossible value
.
Мне просто любопытно узнать, почему это внезапное изменение в поведении неинициализированного bool?
Ну, с точки зрения языка это ясно: поведение не определено. Я понимаю это. Я также понимаю, что компилятор может делать все что угодно. Однако с точки зрения компилятора это кажется мне очень интересным. Что можеткомпилятор (т.е. GCC) возможно, в каждом случае и почему?
Я использую :g++ (GCC) 4.5.0 - MinGW, on Windows 7 Basic, 64-bit OS
.