@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.

Ответы на вопрос(2)

Ваш ответ на вопрос