Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

20.07.2013, 14:25. Просмотров 603. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2013, 14:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос const переменная (C++):

Когда переменная будет const? - C++
Всем привет, вот меня заинтересовал вопрос, я объявил char test = &quot;t&quot;; и компилятор говорит, что это const, когда переменная при таком...

Хочу разобраться с прототипами функций, const но переменная изменяется - C++
Оригиналы хэш функций тут - назовем это ENG статьёй Я так подозреваю написано это на С, но вполне без изменений запустится на С++ ...

int const * const foo(const int* param) const - разъясните значение квалификаторов - C++
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

char operator[](unsigned short offset) const; // что означает const? - C++
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&amp;) const; ...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения - C++
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start-&gt;next;} return c; } Функция...

14
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.07.2013, 14:28 #2
компилятор схитрил и подставил значение константы в место вывовода
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,126
20.07.2013, 14:28 #3
Компилятор офигел от такого, вот и...
Попробуйте так:
volatile const int a = 2;
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
20.07.2013, 14:29 #4
Цитата Сообщение от bgm123 Посмотреть сообщение
Как так может быть?
Это UB
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.07.2013, 14:29 #5
delete
0
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
20.07.2013, 14:36  [ТС] #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Это UB
Что такое UB. Я понимаю, что компилятору стало дурно. Но как по одному и тому же адресу могут содержаться разные значения?

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
компилятор схитрил и подставил значение константы в место вывовода
А откуда он взял это значение?
0
Kuzia domovenok
2041 / 1886 / 172
Регистрация: 25.03.2012
Сообщений: 6,499
Записей в блоге: 1
20.07.2013, 14:39 #7
Цитата Сообщение от bgm123 Посмотреть сообщение
const переменная
переменная - это то, что не const.
Название говорит само за себя.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
20.07.2013, 14:40 #8
Цитата Сообщение от bgm123 Посмотреть сообщение
Но как по одному и тому же адресу могут содержаться разные значения?
Константа, как переменная, вообще может быть удалена из кода.
Цитата Сообщение от bgm123 Посмотреть сообщение
Что такое UB.
Неопределенное поведение
Цитата Сообщение от bgm123 Посмотреть сообщение
А откуда он взял это значение?
В "Поле чудес" выиграл
1
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
20.07.2013, 14:44  [ТС] #9
Цитата Сообщение от Croessmah Посмотреть сообщение
Константа, как таковая, вообще может быть удалена из кода.
Вы бы один раз нормально объяснили и всё. А то на каждый вас ответ получаетс якуча вопросов. Почему она может быть удалена? Вы хотите сказать, что препроцессор перед компиляцией вместо индефикатора a подставляет соотв.значения?

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

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

Добавлено через 1 минуту
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Именно. Только это делает компилятор. Потому что вы ему разрешили, сказав const. То, что вы там себе потом в ногу выстрелили, изменив какое-то значение в памяти, его мало волнует.
Но почему-тол если a сделать типа volatile const, то значение меняется? В этом случае компилятор уже не подставляет константу в текст программы?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
20.07.2013, 14:53 #14
Цитата Сообщение от bgm123 Посмотреть сообщение
Но почему-тол если a сделать типа volatile const, то значение меняется?
потому что volatile говорит компилятору "сие сущность может неявно поменяться, так что оставь её как есть, от греха подальше"
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6511 / 3148 / 308
Регистрация: 04.12.2011
Сообщений: 8,715
Записей в блоге: 5
20.07.2013, 15:54 #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;
}
1
20.07.2013, 15:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2013, 15:54
Привет! Вот еще темы с ответами:

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' - C++
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context Unit1.cpp(55): parsing: void _fastcall...

Модификатор const для параметра функции не const? - C++
void foo(const int N) { int Arr; //&lt;-- ??? } В clang это работает. В VisualStudio 2015 нет.

Cannot convert 'const wchar_t *' to 'const char *' - C++
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC hRes=FindResource(hMod,&quot;acc.dll&quot;,RT_RCDATA); if(!hRes){ } HGLOBAL...

const& и const* в имени функции - C++
Объясните пожалуйста что значит const&amp; и const* в имени и параметрах функции(пример из Вандевурд,Джосаттис): template &lt;typename T&gt; ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.