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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.96
Quadro9
32 / 32 / 1
Регистрация: 23.07.2009
Сообщений: 170
#1

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

10.04.2010, 19:56. Просмотров 3937. Ответов 11
Метки нет (Все метки)

Добрый день, только начал учить с++, поэтому сильно не бейте
интересует такой гипотетический вопрос в целях обучения

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++
Добрый вечер. Есть константы в базовом классе:protected: ... // тут enum'ы и структуры const QString FORMAT_DIR = &quot;format&quot;; ...

Символьные константы - C++
Объясните смысл написанного

Константы препроцесора - C++
А есть ли где-то список предустановленых констант препроцесора? Мне нужно узнать тип операционой системы, версию, и поочие. Есть ли где-то...

Экспоненциальные Константы - C++
Всем доброго времени суток. Хотелось бы спросить такую вещь. Вид Экспоненциальной Константы же такой: {E|e} Тогда такая константа что...

Константы, вычисление... - C++
Только начали учить с++ и уже завалили лабами на понедельник, а я его (с++) в глаза первый раз позавчера увидел :( времени осваивать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Vorona
Peace 2 all shining faces
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,277
10.04.2010, 20:15 #2
вообще-то такого не должно быть, т.к. ic - константа, а значит менять ее значение нельзя
а тут значение ic меняется на 50 в 3 строчке и при этом у вас скомпилировало...бррр
а какой компилятор?
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
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,277
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
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,277
10.04.2010, 21:21 #6
Цитата Сообщение от ggg Посмотреть сообщение
int* ip = (int*)&ic;
//заменить на
int* ip = &ic;
так не выйдет потому что указатель не может указывать на константу
ic остается константой и ей нельзя присвоить другое значение, а вот ip указывает на неконстантную ic ((int*)ic), но вот почему у ip и ic разные значения при одном и том же адресе, я не пойму, ведь ip записывает куда-то свое новое значение....О_о
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
668 / 530 / 45
Регистрация: 05.03.2010
Сообщений: 1,277
10.04.2010, 21:52 #9
не спорю)
но вы не имели ввиду константый указатель, вот я и поправил по данному контексту
но я все-равно не понимаю, как так получается с адресами

Добавлено через 4 минуты
Цитата Сообщение от ggg Посмотреть сообщение
ip указывает на неконстантную ic ((int*)ic)
Как константная
Код C++
1
ic
стала не константной ????
Код C++
1
ic
с этим я вообще запутался, вот и лажи написал(
CyBOSSeR
Эксперт C++
2300 / 1670 / 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ы.
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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2011, 20:41
Привет! Вот еще темы с ответами:

встроенные константы в С++ (pi e) - C++
Подскажите, существуют ли в С++ встроенные константы. Например pi=3.14.... или e=2.71.... Если да, то как их вызвать. Если...

Стринговые константы в С++ - C++
Програмка не работает. Обьясните,пожалуйста,в чем проблема... Само задание звучит так: Вести стринговые константы,найти наибольшое...

Константы, decltype - C++
Суть в том, что, если тип не есть класс, то при определении типа cv-квалификаторы отбрасываются. А сам объект остаётся...

Ввод константы - C++
Имеется массив. Нужно чтоб пользователь вводил его размер, но для этого нужно чтоб переменная была константой. Вопрос как сделать так чтоб...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.03.2011, 20:41
Ответ Создать тему
Опции темы

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