С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
13 / 11 / 4
Регистрация: 08.07.2017
Сообщений: 103
1

приоритет операций. опять(снова)

20.07.2020, 18:46. Показов 2119. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
char str[6]={0,1,2,3,4,5};
char *x=str;
char y=-1;
 
y=*x++;
printf("%d\n",y);
 
y=*(x++);
printf("%d\n",y);
 
y=(*x++);
printf("%d\n",y);
 
y=*++x;
printf("%d\n",y);
}
при запуске выводит
0
1
2
4

Почему такой приоритет? Видел несколько таблиц приоритетов, присваивание приоритет 15.
постфиксный инкремент - 2, (в некоторых таблицах - 3) ,но ассоциативность все равно справа налево!
разыменование - 3.
По логике так и так получается, сначала инкремент, потом разыменование, потом взятие значение по вычисленному адресу и
присваивание.
а на практике GCC компилятор сначала берет значение по адресу! проверил.
И только префиксный инкремент сначала вычисляется а потом за ним разыменование.
То есть, я думал, что при первом выводе будет уже единица на выходе!

Объясните, где я ошибаюсь...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2020, 18:46
Ответы с готовыми решениями:

приоритет операций
while(*a++==*b++ && *a!=NULL) хочу сравнить до конца строки "а". почему не работает? где-то дело...

Приоритет операций
Здравствуйте, а не подскажите что в С-подобных языках приоритетнее: сложение/вычитание, побитовые...

Приоритет побитовых операций
Всем привет. Столкнулся с непоняшкой: // Объявляем два массива и инициализируем их ...

Логические операции и приоритет операций
Привет всем, объясните, пожалуйста: 1)За что отвечает эта часть кода? bool xor(bool a, bool b) {...

4
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,876
20.07.2020, 18:53 2
Цитата Сообщение от HerrSchneider Посмотреть сообщение
По логике так и так получается, сначала инкремент, потом разыменование, потом взятие значение по вычисленному адресу и
присваивание.
"Приоритет операций" и "ассоциативность" описывают процесс синтаксического разбора текста выражения.

Приоритет операций не имеет никакого отношения к порядку вычисления выражения, т.е. никакого отношения к тому, что будет "сначала", а что "потом".
1
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,876
20.07.2020, 19:03 3
Лучший ответ Сообщение было отмечено HerrSchneider как решение

Решение

Цитата Сообщение от HerrSchneider Посмотреть сообщение
То есть, я думал, что при первом выводе будет уже единица на выходе!
С чего бы это вдруг? Приоритеты операций говорят, что выражение y=*x++ разбирается синтаксическим анализатором как ( y ) = (* (x++) ). То есть ++ относится к x, а * относится к результату x++, а = стоит между y и результатом *. На этом задача приоритетов заканчивается. Про приоритеты можно теперь забыть - они нам больше не нужны.

А дальше мы идем в определение постфиксного инкремента и видим, что результатом постфиксного инкремента является старое значение x (до инкремента). То есть оператор * будет применяться к старому значению x и результатом его будет именно нулевой элемент массива str.

Ваши второе и третье выражения полностью эквивалентны первому - дополнительные скобки ни на что не влияют, ибо приоритеты операций и так дают точно такой же синтаксический разбор.
1
13 / 11 / 4
Регистрация: 08.07.2017
Сообщений: 103
20.07.2020, 21:57  [ТС] 4
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
идем в определение постфиксного инкремента и видим, что результатом постфиксного инкремента является старое значение x (до инкремента).
Раньше где то читал такое объяснение. А после стал думать, что это всего лишь мнемоника, когда увидел таблицу приоритетов. думал что от нее надо отталкиваться. А сейчас погуглил, и нашел, что, в общем-то знал.
Спасибо. напомнили.
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
20.07.2020, 22:27 5
HerrSchneider, *x++ вполне валидная конструкция. Оператор x++ всегда возвращает значение ДО инкремента. То что у него приоритет выше разыменования - роли не играет. Приоритет может и выше, но возвращаемое значение, к которому применится * будет "до".
C++
1
2
3
4
5
6
7
8
9
char str[6]={0,1,2,3,4,5};
char *x=str; 
y=*x++;
//переместить указатель на единицу
//вернуть в выражение значение указателя на 0
//разыменовать 
//в качестве аналогии можно привести
x=str;
y = *((x=x+1) - 1);
0
20.07.2020, 22:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.07.2020, 22:27
Помогаю со студенческими работами здесь

Функция дужки(приоритет операций) в калькуляторе
Надо сделать скобки в калькуляторе: сделать дополнительную ф-цию которая будет считать введеные...

Приоритет операций в калькуляторе
Здравствуйте! Подскажите как в калькуляторе, созданном на qt, прописать, чтоб соблюдался приоритет...

C6281: Неверный порядок операций: операторы отношений имеют более высокий приоритет, чем битовые операторы
Пишу змейку(sfml). Мне понадобилось создать while цикл, в котором я делаю две проверки, проверяю...

Приоритет логических операций и операций над множествами.
солидняк Я просто устал переписывать)) поэтому решил уже расписать, разжевать так сказать)). Эту...

Приоритет операций
Подскажите, пожалуйста, приоритет операций в булевой алгебре.

Приоритет операций
Привет всем! Есть ли возможность изменить приоритет операций(умножения, деления)?


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru