![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 13.02.2012
Сообщений: 1
|
![]()
Здравствуйте!
Хочу разобраться со строчкой на C: *ptr++=0; На одном из ресурсов дается следующее объяснение: "Присвоить значение 0* переменной, на которую указывает ptr, затем увеличить значение указателя ptr так, чтобы он указывал на следующую переменную того же типа." Не могу понять принцип работы этой операции. Объясните, кому не трудно и кто знает! Спасибо! |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
![]()
Я хоть и не знаток Си, но по описанию всё становится понятно. По-сути тут два действия:
1. присвоение текущему элементу массива (ссылка на этот элемент *ptr) значения "0" 2. увеличение указателя - т.е. указатель указывает не на текущий элемент массива, а на следующий. От типа переменных в массиве зависит на сколько увеличится указатель.
Правильно поставленная задача - три четверти решения.
|
![]() |
![]() |
![]() |
#3 | |
Форумчанин
Регистрация: 01.07.2011
Сообщений: 423
|
![]() Цитата:
Важно знать порядок вычисления выражений и приоритет операторов. Для указанного вами выражения *ptr++=0; порядок вычисления следующий: 1) выполняется оператор ++ 2) разыменовывается указатель с помощью оператора * 3) выполняется присваивание разыменованноку указателю значения 0 с помощью оператора = Но этого недостаточно, чтобы понять, что в конечном итоге получится. Нужно еще знать, что является рузультатом выполнения каждой операции. Результатом выполнения постинкриментного оператора ++ является значение его операнда до применения к нему инкримента. То есть значением является копия исходного значения. Причем полученное значение является rvalue , то есть значение, которое нельзя изменять. Чтобы было понятно, то, допустим, есть выражение x++++;. Это выражение можно представить как ( x++ )++.Сначала должно выполниться операция x++. Но так как полученное значение является rvalue и его менять нельзя, то в итоге получим ошибку компиляции. Такую же ошибку компиляции мы получим и для выражения ++x++;, так как сначала выполняется постинкримент, в результате которого получается rvalue, которое нельзя изменять. Но если вы напишите так ( ++x )++;, то компилятор скомпилирует этот код, так как значением прединкримента является lvalue, то есть значение, которое можно менять. Теперь полученная копия исходного значения ptr разыменовывается с помощью оператора *, и этому разыменованному значению присваивается 0. В этом объяснении термины rvalue и lvalue происходят от условного обозначения операндов в выражении присваивания: lvalue= rvalue; Например, x = 2;. Здесь x - это lvalue, то есть переменная, задающая область памяьти, которой можно присвоить значение, а 2 - это rvalue, ей значение нельзя присвоить.
Со мной можно встретиться на www.clipper.borda.ru
Последний раз редактировалось Сыроежка; 13.02.2012 в 18:45. |
|
![]() |
![]() |
![]() |
#4 | ||
В стагнации
Участник клуба
Регистрация: 29.07.2011
Сообщений: 1,303
|
![]() Цитата:
![]() У операции разыменования самый высокий приоритет. Потом выполняется присвоение, а уж потом инкремент. Цитата:
Код:
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание. |
||
![]() |
![]() |
![]() |
#5 | |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
![]() Цитата:
Выглядит это примерно так: Код:
|
|
![]() |
![]() |
![]() |
#6 | |
В стагнации
Участник клуба
Регистрация: 29.07.2011
Сообщений: 1,303
|
![]() Цитата:
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание. |
|
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
![]() Цитата:
Прав MooNDeaR. Именно в этом порядке. Разыменование, присвоение и постфиксный ++.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
|
![]() |
![]() |
![]() |
#8 |
Участник клуба
Регистрация: 07.07.2009
Сообщений: 1,385
|
![]()
Вот, мальчики, Вы все спорите, спорите...Возьмите и потестите дебагом в режиме Step into - и сразу будет понятно, кто прав. Можно же будет сразу отследить, что увидит компилятор на каждом шагу))))
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
|
![]() |
![]() |
![]() |
#9 | ||
Старожил
Регистрация: 12.11.2010
Сообщений: 8,568
|
![]() Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
#10 | |
В стагнации
Участник клуба
Регистрация: 29.07.2011
Сообщений: 1,303
|
![]() Цитата:
![]()
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание. |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
JMP DWORD PTR [PAddress] - как узнать адрес | Enkee | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 03.11.2011 13:14 |