#cpp #c #указатели #const
Доброго времени суток.
В Си с помощью указателя я могу изменить значение константы.
const int a = 5;
int *p = &a;
*p = 10;
printf("%d", a);
Вывод:10
В Си++ компилятором допускается следующий код:
const int a = 5;
int *p = (int *) &a;
*p = 10;
std::cout << *p << " " << a;
Вывод:10 5
Значение по адресу указателя p изменилось, в то время как сама a - нет? Как это работает?
Ответы
Ответ 1
Ни в С, ни в С++ никаким способами не разрешается изменять значение константного объекта. Любые попытки такого изменения приводят к неопределенному поведению. Именно неопределенное поведение вы и наблюдаете в обоих своих примерах. Язык С 6.7.3 Type qualifiers 6 If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined. Язык С++ 9.1.7.1 The cv-qualifiers 4 Except that any class member declared mutable can be modified, any attempt to modify a const object during its lifetime results in undefined behavior. В Си с помощью указателя я могу изменить значение константы. Нет, конечно. Такая инициализация указателя не допускается ни в С, ни в С++ const int a = 5; int *p = &a; Неявного преобразования const int * к int * в этих языках нет. Такое преобразование можно сделать только явно. Но и явное преобразование не поможет вам "изменить константу". Как это работает? Никак не работает. Неопределенное поведение.
Комментариев нет:
Отправить комментарий