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

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

Восстановить пароль Регистрация
 
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
20.07.2013, 14:25     const переменная #1
Вопрос по коду ниже. Насколько я знаю 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.07.2013, 14:28     const переменная #2
компилятор схитрил и подставил значение константы в место вывовода
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
20.07.2013, 14:28     const переменная #3
Компилятор офигел от такого, вот и...
Попробуйте так:
volatile const int a = 2;
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11812 / 6791 / 768
Регистрация: 27.09.2012
Сообщений: 16,854
Записей в блоге: 2
Завершенные тесты: 1
20.07.2013, 14:29     const переменная #4
Цитата Сообщение от bgm123 Посмотреть сообщение
Как так может быть?
Это UB
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 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
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.07.2013, 14:39     const переменная #7
Цитата Сообщение от bgm123 Посмотреть сообщение
const переменная
переменная - это то, что не const.
Название говорит само за себя.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11812 / 6791 / 768
Регистрация: 27.09.2012
Сообщений: 16,854
Записей в блоге: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11812 / 6791 / 768
Регистрация: 27.09.2012
Сообщений: 16,854
Записей в блоге: 2
Завершенные тесты: 1
20.07.2013, 14:45     const переменная #10
Цитата Сообщение от bgm123 Посмотреть сообщение
Почему она может быть удалена?
Потому что в ней нет смысла.
Цитата Сообщение от bgm123 Посмотреть сообщение
Вы хотите сказать, что препроцессор перед компиляцией
Препроцессору вообще по барабану! Он работает на уровне текстовых файлов.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.07.2013, 14:46     const переменная #11
Цитата Сообщение от bgm123 Посмотреть сообщение
Вы хотите сказать, что препроцессор перед компиляцией вместо индефикатора a подставляет соотв.значения?
Именно. Только это делает компилятор. Потому что вы ему разрешили, сказав const. То, что вы там себе потом в ногу выстрелили, изменив какое-то значение в памяти, его мало волнует.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11812 / 6791 / 768
Регистрация: 27.09.2012
Сообщений: 16,854
Записей в блоге: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11812 / 6791 / 768
Регистрация: 27.09.2012
Сообщений: 16,854
Записей в блоге: 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 переменная
Еще ссылки по теме:

C++ error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+'
C++ int const * const foo(const int* param) const - разъясните значение квалификаторов
C++ Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,690
Записей в блоге: 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 переменная
Ответ Создать тему
Опции темы

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