LINUX.ORG.RU

C++: Выражение вида *ptr-- = 1;


0

0

char *ptr;

делаем чтоб ptr куда-то указывал.

*ptr-- = '1';

Как это не смешно означает:
Положить куда указывает ptr '1', и потом только передвинутся на предыдущую ячейку. Хотя операция -- имеет большей приоритет чем операция * разименовувания.

Тот же результат будет если:
*(ptr--) = '1';
Все равно он сначала присвоит 1, а потом только декрементирует указатель.


ТУПИЗНА! ПОЛ ДНЯ ПОТРАТИЛ! Как такое может быть ?

anonymous

>ТУПИЗНА! ПОЛ ДНЯ ПОТРАТИЛ! Как такое может быть ?

тривиально:

>Хотя операция -- имеет большей приоритет чем операция * разименовувания.

ну да, а не хотел что в твоём случае у ней приоритет ниже чем у присваивания???

cvv ★★★★★
()

> Хотя операция -- имеет большей приоритет чем операция *

про то, что ptr-- является ПОСТфиксным декрементом не забывайте

phoenix ★★★★
()

>Хотя операция -- имеет большей приоритет чем операция * >разименовувания.

не путайте --ptr и ptr--.

anonymous
()
Ответ на: комментарий от cvv

Я запутался...
Идем к Бъерну Страуструпу, рус издание. Язык Программирования С++ 2004г.
ст 161

Говорит что lvalue-- постфиксный декремент имеет больший приоритет чем:
разыменование *expr
простое присваивание lvalue = expr


может какой-то смысл в lvalue и expr ?
сложно...
но казалось бы *(ptr--) = 1; должно декрементировать, потом разыменовувать, потом присваивать. а на деле это не так.

anonymous
()
Ответ на: комментарий от anonymous

>Идем к Бъерну Страуструпу, рус издание. Язык Программирования С++ 2004г. ст 161

сильно похоже что издание перепечатано с какогото 1994г.

>Говорит что lvalue-- постфиксный декремент имеет больший приоритет чем:
>разыменование *expr
>простое присваивание lvalue = expr

не может быть чтобы постфиксный декремент имел более высокий приоритет чем разыменование, прочитайте ещё раз


вообщето по стандарту это компилерно-зависимая весчь. как создатели комепилера посчитают правильным так и будет

cvv ★★★★★
()
Ответ на: комментарий от anonymous

> но казалось бы *(ptr--) = 1; должно декрементировать, потом разыменовувать, потом присваивать. а на деле это не так.

берется текущее значение ptr, к нему применяется postfix --, т.е. в выражении используется _текущее_ значение ptr, а после окончания вычисления делается ptr-=1. Все логично, почитайте книгу в том месте, где говорится, что

(cout << a++;) == (cout << a; a+=1;)

phoenix ★★★★
()
Ответ на: комментарий от anonymous

>может какой-то смысл в lvalue и expr ? сложно... но казалось бы *(ptr--) = 1; должно декрементировать, потом разыменовувать, потом присваивать. а на деле это не так.

На то он и __постфиксный__ (инкрементация происходит после передачи исходного значения следующему оператору), есть же еще и префиксный

приоритет оператора -- перед * в выражении *ptr-- означает, что будет *(ptr--),а не (*ptr)--.

kosmonavt
()
Ответ на: комментарий от cvv

>не может быть чтобы постфиксный декремент имел более высокий приоритет чем разыменование, прочитайте ещё раз

Может. Так и есть. Просто _результатом_ постфиксных операторов является _старое_ значение.

>вообщето по стандарту это компилерно-зависимая весчь. как создатели комепилера посчитают правильным так и будет

Пункт стандарта с студию.

Уважаемый cvv, я не модератор, но позвольте дать совет.

Если Вы в чем-то сомневаетесь или знаете не совсем точно, не забывайте обозначать степень достоверности сообщаемой информации, чтобы не сбивать людей с толку. Иногда даже неточное знание и/или догадки м.б. полезны, но нужно обязательно сообщать, что это именно догадки/cмутные обрывки воспоминаний и т.д.

anonymous
()
Ответ на: комментарий от anonymous

>>не может быть чтобы постфиксный декремент имел более высокий приоритет чем разыменование, прочитайте ещё раз

>Может. Так и есть. Просто _результатом_ постфиксных операторов является _старое_ значение.

>>вообщето по стандарту это компилерно-зависимая весчь. как создатели комепилера посчитают правильным так и будет

>Пункт стандарта с студию.

извиняюсь. спутал грешное с праведным. Мне почемуто показалось что выполнение постфиксных операций после взятия значения связанно именно с их приоритетом а не экзотическим характером поведения.

cvv ★★★★★
()
Ответ на: комментарий от cvv

> не может быть чтобы постфиксный декремент имел более высокий приоритет чем разыменование, прочитайте ещё раз

тем не менее это так. может кому-то стоит почитать стандарт?

автору поста: не пытайся выучить С++ по страуструпу, это абсолютно бесполезно, возьми более вменяемого автора, например, Шилдта "полный справочник по С++". после того как воткнёшь можешь читать Александреску и Саттера у них 4 книги серия "C++ in depth", советую все купить.

Reset ★★★★★
()

Мамочки, ну и топик... Может и правда пора с ЛОРа уходить...

Какую интересно связь автор вопроса усмотрел между приоритетом операций и порядком выполнения?

И почему он задаёт вопросы по C, не прочитав не единой книжки по этому языку?

Teak ★★★★★
()
Ответ на: комментарий от Teak

А некоторые отвечающие ещё круче - путают порядок выполнения с расположением унарной операции до или после операнда :)

Teak ★★★★★
()
Ответ на: комментарий от Reset

как понадобится так и сразу. С++ я давно не пользовал, года два

cvv ★★★★★
()

вообще в C++ всякие *ptr-- = 1; - ЗЛО! идите на C изъебствуйтесь

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.