Что делает компилятор GCC для преобразования типов?Почему вывод на Mac и Linux разные? - PullRequest
0 голосов
/ 27 апреля 2019

Я сделал преобразование типа переменной b (объявление вне области видимости) в области видимости и присвоил b новое значение val, и когда область действия заканчивается, значение b представляется неправильным.

Этопроисходит на моем MacBook, версия GCC которого является GCC-8 (Homebrew GCC 8.3.0) 8.3.0.Я попробовал тот же код на моем ноутбуке с Linux, чья версия gcc - 5.4.0, и код работает хорошо.

std::vector<int> a = {1,2,3,4};
int b;
{
    size_t i = 0, b = a[i];
    //this time type of b is size_t

    ++i;
    b = a[i];
}
std::cout << "b = " << b << std::endl;

На моем Mac результат равен b = 0 На Ubuntu 16 результат равен b = 1

В чем разница между двумя версиями gcc при преобразовании типов?

Или это баг?

1 Ответ

6 голосов
/ 27 апреля 2019

Вы не делаете никакого преобразования типов, вы создаете секунду b в области видимости, что из-за того, что оно имеет то же имя, shadows externalb.Это означает, что вы назначаете что-то внутреннему b и оставляете внешнее b нетронутым.Как только область действия заканчивается (на закрывающей фигурной скобке), вы остаетесь с (неинициализированным) внешним b, и при печати его вызывается неопределенное поведение , и это именно то, что вы испытываете.

Этот фрагмент кода семантически эквивалентен и может немного лучше показать, что происходит на самом деле:

vector<int> a = {1,2,3,4};
int outer_b;
{
    size_t i = 0, inner_b = a[i];
    //this time type of b is size_t

    ++i;
    inner_b = a[i];

}
cout << "b = " << outer_b << endl;
...