Доброго времени суток.
В Си с помощью указателя я могу изменить значение константы.
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 - нет? Как это работает?
Ни в С, ни в С++ никаким способами не разрешается изменять значение константного объекта. Любые попытки такого изменения приводят к неопределенному поведению. Именно неопределенное поведение вы и наблюдаете в обоих своих примерах.
Язык С
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 *
в этих языках нет. Такое преобразование можно сделать только явно. Но и явное преобразование не поможет вам "изменить константу".
Как это работает?
Никак не работает. Неопределенное поведение.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Всем добрый деньПосмотрел много вариантов решения проблемы но что то ничего не помогает
Подскажите, как задать точность вывода float/double числа через printf?
Требуется скопировать файл из одной папки в другуюСделать это было решено через функцию "fileCopy()"
Я новичок в Андроиде , и во время разработки у меня возникла проблема с сохранением AndroidSpinner при повороте єкрана