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

изменение константы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.96
Quadro9
 Аватар для Quadro9
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
10.04.2010, 19:56     изменение константы #1
Добрый день, только начал учить с++, поэтому сильно не бейте
интересует такой гипотетический вопрос в целях обучения

C++
1
2
3
4
5
const int ic = 100;
int* ip = (int*)⁣
*ip = 50;
cout << &ic << " - " << ip << endl;// адрес одинаковый 
cout << ic << " - " << *ip << endl;// значения разные
как такое может быть?
ясно что код бредовый, и все же..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2010, 19:56     изменение константы
Посмотрите здесь:

символьные константы C++
Стринговые константы в С++ C++
C++ Определение константы
C++ Константы, переменные
Указатели и константы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
10.04.2010, 20:15     изменение константы #2
вообще-то такого не должно быть, т.к. ic - константа, а значит менять ее значение нельзя
а тут значение ic меняется на 50 в 3 строчке и при этом у вас скомпилировало...бррр
а какой компилятор?
Quadro9
 Аватар для Quadro9
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
10.04.2010, 20:50  [ТС]     изменение константы #3
VS-2008
скомпилилось без ошибок, и что странно константа не изменилась (или это не странно), а указатель (пусть и не константный) на эту константу изменил значение, хотя адреса одинаковые...
самое странное получается что у одного адреса два значания..

Добавлено через 15 минут
хотя дебагер показует что у них одинаковые значения - 50 - 50, но выводит почему-то 100 - 50
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
10.04.2010, 20:54     изменение константы #4
думаю, это из-за приведения типа const int к int
ggg
3 / 3 / 0
Регистрация: 03.03.2009
Сообщений: 86
10.04.2010, 21:06     изменение константы #5
Это излишне
C++
1
int* ip = (int*)&ic;
При обращении к ссылке операция * производится автоматически.
C++
1
2
3
int* ip = (int*)&ic;
//заменить на 
int* ip = &ic;
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
10.04.2010, 21:21     изменение константы #6
Цитата Сообщение от ggg Посмотреть сообщение
int* ip = (int*)&ic;
//заменить на
int* ip = &ic;
так не выйдет потому что указатель не может указывать на константу
ic остается константой и ей нельзя присвоить другое значение, а вот ip указывает на неконстантную ic ((int*)ic), но вот почему у ip и ic разные значения при одном и том же адресе, я не пойму, ведь ip записывает куда-то свое новое значение....О_о
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
10.04.2010, 21:24     изменение константы #7
Цитата Сообщение от ggg Посмотреть сообщение
Это излишне
C++
1
int* ip = (int*)&ic;
C++
1
2
3
int* ip = (int*)&ic;
//заменить на 
int* ip = &ic;
Так не будет компилироваться
хотя дебагер показует что у них одинаковые значения - 50 - 50, но выводит почему-то 100 - 50
очень интересная ситуация.
Интересно, что по этому поводу скажут зешние мастера
ggg
3 / 3 / 0
Регистрация: 03.03.2009
Сообщений: 86
10.04.2010, 21:40     изменение константы #8
Цитата Сообщение от Vorona Посмотреть сообщение
так не выйдет потому что указатель не может указывать на константу
ic остается константой и ей нельзя присвоить другое значение, а вот ip указывает на неконстантную ic ((int*)ic), но вот почему у ip и ic разные значения при одном и том же адресе, я не пойму, ведь ip записывает куда-то свое новое значение....О_о
Есть константный (неизменный) указатель.
Для него значение указателя менять нельзя.
Значение того, на что он указывает, менять можно.
C++
1
2
int &x = 2;
int *const y = &x
ip указывает на неконстантную ic ((int*)ic)
Как константная
C++
1
ic
стала не константной ????
C++
1
ic
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
10.04.2010, 21:52     изменение константы #9
не спорю)
но вы не имели ввиду константый указатель, вот я и поправил по данному контексту
но я все-равно не понимаю, как так получается с адресами

Добавлено через 4 минуты
Цитата Сообщение от ggg Посмотреть сообщение
ip указывает на неконстантную ic ((int*)ic)
Как константная
Код C++
1
ic
стала не константной ????
Код C++
1
ic
с этим я вообще запутался, вот и лажи написал(
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.04.2010, 22:21     изменение константы #10
Скорее всего компилятор просто фактически подставил вместо ic в строке:
C++
1
cout << ic << " - " << *ip << endl; // значения разные
50 ибо ic константа.
Проверить легко, вместо данной строки напишите:
C++
1
std::cout << *((int*)(&ic)) << " - " << *ip << std::endl;
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
11.04.2010, 12:31     изменение константы #11
В результате выполнения данного кусочка кода,*действительно константа ic должна изменится. В С++ даже есть специальный
C++
1
const_cast
позволяющий это делать. const лишь указывает компилятору, что менять данную переменную, когда она встречается в выражении, нельзя. В Си нету
C++
1
const_cast
, и такое преобразование ему аналогично.
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(int argc, char *argv[])
{
    const int ic = 100;
    int* ip = (int*)&ic;
    *ip = 50;
    printf("%x %x\n", &ic, ip);
    printf("%d %d\n", ic, *ip);
}
Этот код должен вывести второй строчкой два одинаковых значения.

Добавлено через 4 минуты
Не используйте в С++ function-style и с-style сastы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2011, 20:41     изменение константы
Еще ссылки по теме:

C++ Константы и C++
C++ Константы и указатели
Указатели и константы C++

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

Или воспользуйтесь поиском по форуму:
Vlad_VS
Сообщений: n/a
06.03.2011, 20:41     изменение константы #12
Насколько я понял, компилятор, действительно, встраивает значение константы в месте её вызова.
Чтобы избежать этого, необходимо использовать ключевое слово volatile при объявлении константы.
Таким образом результат вышеуказанной программы, но с использованием volatile, у меня выглядел следующим образом:
12ff60 12ff60
50 50

А вот результат программы автора с применением volatile выглядит так:
1 - 0012FF60
50 - 50

Вот теперь не пойму почему cout выводит &ic как 1, а не 0012FF60, но printf() выводит правильно, показует именно 12ff60, а не 1.
Yandex
Объявления
06.03.2011, 20:41     изменение константы
Ответ Создать тему
Опции темы

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