Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
#1

const переменная - C++

20.07.2013, 14:25. Просмотров 508. Ответов 14
Метки нет (Все метки)

Вопрос по коду ниже. Насколько я знаю const переменная, это переменная по имени которой нельзя перезаписывать область памяти. Я завёл указатель на такую переменную, который не const. Изменил значение в этой области памяти с помощью указателя. И вот что получил. Адресс который в ptr и a совпадают, но значения по этому адресу содержатся разные. Как так может быть?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    const int a = 2;
    int *ptr = (int *)&a;
 
    *ptr = 10;
 
    cout << "adress a     : " << &a << endl;
    cout << "adress in ptr: " << ptr << endl;
    cout << "data a       : " << a << endl;
    cout << "data ptr     : " << *ptr << endl;
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2013, 14:25     const переменная
Посмотрите здесь:

C++ Когда переменная будет const?
const function C++
'const char* ...' does not much 'const char*' ??? C++
const C++
const double * C++
C++ static const?
C++ Разница между объявлениями const Person p1 и Person const p1
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.07.2013, 14:28     const переменная #2
компилятор схитрил и подставил значение константы в место вывовода
0x10
2451 / 1623 / 238
Регистрация: 24.11.2012
Сообщений: 3,993
20.07.2013, 14:28     const переменная #3
Компилятор офигел от такого, вот и...
Попробуйте так:
volatile const int a = 2;
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12534 / 7096 / 797
Регистрация: 27.09.2012
Сообщений: 17,508
Записей в блоге: 2
Завершенные тесты: 1
20.07.2013, 14:29     const переменная #4
Цитата Сообщение от bgm123 Посмотреть сообщение
Как так может быть?
Это UB
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.07.2013, 14:29     const переменная #5
delete
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
20.07.2013, 14:36  [ТС]     const переменная #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Это UB
Что такое UB. Я понимаю, что компилятору стало дурно. Но как по одному и тому же адресу могут содержаться разные значения?

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
компилятор схитрил и подставил значение константы в место вывовода
А откуда он взял это значение?
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
20.07.2013, 14:39     const переменная #7
Цитата Сообщение от bgm123 Посмотреть сообщение
const переменная
переменная - это то, что не const.
Название говорит само за себя.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12534 / 7096 / 797
Регистрация: 27.09.2012
Сообщений: 17,508
Записей в блоге: 2
Завершенные тесты: 1
20.07.2013, 14:40     const переменная #8
Цитата Сообщение от bgm123 Посмотреть сообщение
Но как по одному и тому же адресу могут содержаться разные значения?
Константа, как переменная, вообще может быть удалена из кода.
Цитата Сообщение от bgm123 Посмотреть сообщение
Что такое UB.
Неопределенное поведение
Цитата Сообщение от bgm123 Посмотреть сообщение
А откуда он взял это значение?
В "Поле чудес" выиграл
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
20.07.2013, 14:44  [ТС]     const переменная #9
Цитата Сообщение от Croessmah Посмотреть сообщение
Константа, как таковая, вообще может быть удалена из кода.
Вы бы один раз нормально объяснили и всё. А то на каждый вас ответ получаетс якуча вопросов. Почему она может быть удалена? Вы хотите сказать, что препроцессор перед компиляцией вместо индефикатора a подставляет соотв.значения?

Добавлено через 1 минуту
Иначе, как объяснить, что после перезаписывания битов по адресу a значения a не поменялось. Так не бывает!
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12534 / 7096 / 797
Регистрация: 27.09.2012
Сообщений: 17,508
Записей в блоге: 2
Завершенные тесты: 1
20.07.2013, 14:45     const переменная #10
Цитата Сообщение от bgm123 Посмотреть сообщение
Почему она может быть удалена?
Потому что в ней нет смысла.
Цитата Сообщение от bgm123 Посмотреть сообщение
Вы хотите сказать, что препроцессор перед компиляцией
Препроцессору вообще по барабану! Он работает на уровне текстовых файлов.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1242 / 991 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.07.2013, 14:46     const переменная #11
Цитата Сообщение от bgm123 Посмотреть сообщение
Вы хотите сказать, что препроцессор перед компиляцией вместо индефикатора a подставляет соотв.значения?
Именно. Только это делает компилятор. Потому что вы ему разрешили, сказав const. То, что вы там себе потом в ногу выстрелили, изменив какое-то значение в памяти, его мало волнует.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12534 / 7096 / 797
Регистрация: 27.09.2012
Сообщений: 17,508
Записей в блоге: 2
Завершенные тесты: 1
20.07.2013, 14:46     const переменная #12
Цитата Сообщение от bgm123 Посмотреть сообщение
Так не бывает!
Я же написал - UB, а может даже и программа упасть!
А может даже и так, что компилятор сразу вычислил все значения и проставил их куда нужно, и указатель тоже выкинул, ибо че зря тратиться
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
20.07.2013, 14:51  [ТС]     const переменная #13
Ну тогда скажите, если конечно знаете, как по одному и тому же адресу памяти могут содержаться разные данные?

Добавлено через 1 минуту
Всё понял.

Добавлено через 1 минуту
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Именно. Только это делает компилятор. Потому что вы ему разрешили, сказав const. То, что вы там себе потом в ногу выстрелили, изменив какое-то значение в памяти, его мало волнует.
Но почему-тол если a сделать типа volatile const, то значение меняется? В этом случае компилятор уже не подставляет константу в текст программы?
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12534 / 7096 / 797
Регистрация: 27.09.2012
Сообщений: 17,508
Записей в блоге: 2
Завершенные тесты: 1
20.07.2013, 14:53     const переменная #14
Цитата Сообщение от bgm123 Посмотреть сообщение
Но почему-тол если a сделать типа volatile const, то значение меняется?
потому что volatile говорит компилятору "сие сущность может неявно поменяться, так что оставь её как есть, от греха подальше"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2013, 15:54     const переменная
Еще ссылки по теме:

Нужен ли const? C++
Int* const или const int*? C++
C++ Чем отличаются выражения (const int[]){value} от (const int[]){100}
C++ No init for const!
Переменная или переменная и условие C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6348 / 2995 / 295
Регистрация: 04.12.2011
Сообщений: 8,034
Записей в блоге: 3
20.07.2013, 15:54     const переменная #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int foo(){
int a=3;
int b=4;
return a+b;
}
#include <iostream>
using namespace std;
int main()
{
const int a = foo();//давайте усложним инициализацию, 
//чтобы a не встраивалась в код а хранилась по адресу (моё предположение)
int *ptr = (int *)&a;
 *ptr = 10;
    cout << "adress a     : " << &a << endl;
    cout << "adress in ptr: " << ptr << endl;
    cout << "data a       : " << a << endl;
    cout << "data ptr     : " << *ptr << endl;
 
cout<<endl;
cin.get();
    return 0;
}


Добавлено через 39 минут
bgm123, поскольку тему просматривает и Biglow, задававший схожий вопрос:
Как обычную переменную на время сделать константой?
может будет интересно посмотреть вариант, как пользуясь доступом через указатель на константу менять значение по этому указателю при помощи этого же указателя без хулиганства:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int x = 10;
const int *a = new int(x);
cout<<"a= "<<*a<<endl; 
do{
cout<<"\nВведите целое число,"
"\nЕсли нечётное: ++a"
"\nЕсли чётное: a" 
"\nЕсли 0 - ВЫХОД\n"; 
cin>>x;
//будем увиличивать a только если x нечетное, например
if(x%2){//условие переключатель разрешающее изменение a
int tmp = *a;
delete a;
a = new int(++tmp);
}
//++*a; //это не скомпилируется, как и ожидалось
cout<<"a= "<<*a<<endl;
}while(x);
delete a;
cout<<endl;
cin.get();
return 0;
}
Yandex
Объявления
20.07.2013, 15:54     const переменная
Ответ Создать тему
Опции темы

Текущее время: 23:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru