Неожиданный вывод - PullRequest
       11

Неожиданный вывод

1 голос
/ 16 марта 2011
#include <iostream>

int main() 
{

    const int i=10;
    int *p =(int *) &i;
    *p = 5;
    cout<<&i<<" "<<p<<"\n";
    cout<<i<<" "<<*p;
    return 0;
}

Выход:

0x22ff44 0x22ff44

10 5

Пожалуйста, объясните.

Ответы [ 3 ]

12 голосов
/ 16 марта 2011

Ну, ваш код явно содержит неопределенное поведение, так что может произойти все что угодно.

В этом случае, я полагаю, что происходит так:

В C ++ константы считаются константами времени компиляции. В вашем примере компилятор в основном заменяет ваше «i» числом 10.

5 голосов
/ 16 марта 2011

Вы пытались изменить объект const, поэтому поведение не определено.Компилятор имеет право предполагать, что значение объекта const не изменяется, что, вероятно, объясняет симптомы, которые вы видите.Компилятор также имеет право помещать объект const в постоянную память.Обычно это не происходит для переменной с автоматическим временем жизни, но многое будет, если у const статическое время жизни;в этом случае произойдет сбой программы (на большинстве систем).

2 голосов
/ 16 марта 2011

Я попытаюсь это сделать: поскольку для этого вывода нет логической причины, компилятор должен был оптимизировать этот несчастный cout<<i<<" " до простого "cout<<"10 ".Но это всего лишь догадка.

...