реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Вопрос(ы) по коду
ViKo
сообщение Jun 15 2018, 04:52
Сообщение #16


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Forger @ Jun 14 2018, 22:12) *
Значит msdn тоже врет, все врут! Но коли так, покажите свою "правильную" табличку cool.gif

Посмотрите у Кернигана с Ричи, и у Шилда в книгах.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 15 2018, 05:01
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(ViKo @ Jun 15 2018, 07:52) *
Посмотрите у Кернигана с Ричи, и у Шилда в книгах.
Чтобы не быть голословным, приведите сюда конкретные цитаты из этих книг, а конкретно приоритеты оператора постфиксного инкремента ++ и оператора [].


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 15 2018, 07:06
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Forger @ Jun 14 2018, 21:11) *
. . . Оператор "[]" имеет приоритет, равный приоритету оператора "++". . .
Это не так, приоритеты у них одинаковые ))
Да, надо будет перечитать "классику". И делать это постоянно sm.gif
+ порядок "разбора" строки компилятором слева направо, как обычные операторы +-*/
Ни у кого не возникает вопроса в результате выражения A/B*C



Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 15 2018, 07:15
Сообщение #19


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Forger @ Jun 15 2018, 08:01) *
Чтобы не быть голословным, приведите сюда конкретные цитаты из этих книг, а конкретно приоритеты оператора постфиксного инкремента ++ и оператора [].

Я думаю, вы в состоянии самостоятельно полистать книги. Стр. примерно 66 - 69. Для пост- и пре- ++ и - - там нет различий, это, видимо, позже придумали словоблуды (стандартизаторы) и шарлатаны из MS. Кстати, в стандарте что на этот счет?
P.S. в стандарте на C99 я не нашел слова priority
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 15 2018, 07:30
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



? z1 = ++ms[10] - синтаксис оператора для двух приведенных вариантов один. Тут могут быть грабли ?

динамический массив
Цитата
int ms[100], z0, z1;
. . .
z = ms[10]++;
z1 = ++ms[10];

указатель на массив
Цитата
int *ms = new int(100);
int z0, z1, z3;
. . .
z = ms[10]++;
z1 = ++ms[10];
z3 = (++ms)[10];
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jun 15 2018, 09:31
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Jenya7 @ Jun 14 2018, 18:10) *
а можно узнать что имел в виду писавший это? a[b]++ или таки a[b++]

Чтобы узнать что имел ввиду писавший лучше спросить у самого писавшего.
Но написал он инкремент элемента массива, а не индекса.

Цитата(k155la3 @ Jun 15 2018, 10:30) *
? z1 = ++ms[10] - синтаксис оператора для двух приведенных вариантов один. Тут могут быть грабли ?


В простых выражениях ++a[b] (или a[b]++) никаких грабель не будет, причем независимо от порядка разбора.

В обоих случах "int *ms = new int(100);" и "int *ms = new int(100);" для компилятора различия сводятся
лишь к проверке типа, а сама переменная ms является по сути указателем в обоих случаях.





Сообщение отредактировал aiwa - Jun 15 2018, 09:01
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 15 2018, 09:35
Сообщение #22


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(ViKo @ Jun 15 2018, 10:15) *
Для пост- и пре- ++ и - - там нет различий, это, видимо, позже придумали словоблуды (стандартизаторы) и шарлатаны из MS. Кстати, в стандарте что на этот счет?

В стандарте С99 нет деления между постфиксным и префиксным инкрементом. Приоритет этих операций равен приоритету оператора [].
В стандартах C++ префиксный операторы перенесли в группу приоритетов ниже. Постфиксные остались на прежнем месте.

Т.е. как я и говорил постфиксный ++ имеет равный приоритет как и []. Не зависимо от стандарта. Не путайте народ!

Вот ссылки для сравнения:
http://ru.cppreference.com/w/c/language/operator_precedence
http://ru.cppreference.com/w/cpp/language/...ator_precedence


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 15 2018, 09:53
Сообщение #23


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Из Шилдта
Цитата
Order of Evaluation
C does not specify the order in which the subexpressions of an expression are evaluated. This leaves
the compiler free to rearrange an expression to produce more
Highest ( ) [ ] –>.
! ~ ++ – – – (type) * & sizeof
* / %
+ –
<< >>
< <= > >=
== !=
&
^
|
&&
| |
?:
= += –= *= /= etc.
Lowest ,
Table 2 -8. Precedence of C Operators


Из К&R
Цитата
Operators Associativity
() [] -> . left to right
! ~ ++ -- + - * (type) sizeof right to left
* / % left to right
+ - left to right
<< >> left to right
< <= > >= left to right
== != left to right
& left to right
^ left to right
| left to right
&& left to right
|| left to right
?: right to left
= += -= *= /= %= &= ^= |= <<= >>= right to left
, left to right
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 15 2018, 10:16
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(ViKo @ Jun 15 2018, 10:15) *
в стандарте на C99 я не нашел слова priority

Там используется другой термин: precedence

Вот любопытная ссылка:
https://www.geeksforgeeks.org/difference-between-p-p-and-p/
По сути a[b] есть (*( a + b ))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Herz
сообщение Jun 15 2018, 10:42
Сообщение #25


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Автор! В этом разделе 99% вопросов "по коду". Вы же не новичок, Вам должно быть это известно. Придумайте, пожалуйста, для темы более чёткое название.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 15 2018, 10:51
Сообщение #26


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Forger @ Jun 15 2018, 13:16) *
Там используется другой термин: precedence

Я по всякому искал, не нашел. Это удивляет.
P.S. но не очень усердно
Прикрепленные файлы
Прикрепленный файл  C99.pdf ( 1.35 мегабайт ) Кол-во скачиваний: 6
 
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 15 2018, 10:57
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



IMHO: Использование постфиксных, и тем более - префиксных ++ в составе выражения ухудшает читабельность кода.
Смысла особого в такой "упаковке" не вижу. Компилятору - это филоетово, Будет ли оптимизация у исполнимого кода,
и к чему она приведет при таком написании - вопрос. Имело смысл, когда тактовая процессора измерялась килогерцами.
Хотя если задача - запутать читающего - то "самое-то" sm.gif
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 15 2018, 10:58
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(ViKo @ Jun 15 2018, 13:51) *
Я по всякому искал, не нашел. Это удивляет.

Увы, в стандарте нет явной precedence table, есть только жалкие крохи, которые еще больше запутывают.
Я пришел к выводу, что каждый компилятор может некоторые нюансы трактовать по-своему. Другими словами стандарт "отдает это на откуп" разработчику компилятора.
Поэтому подобные "мутные дела" лучше проверять на конкретном компиляторе.
Хотя, имхо, правильнее вообще избегать таких мутных дел и писать код более явно, чтобы любой компилятор правильно понял это. Да и читать такой код намного проще ))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 15 2018, 11:38
Сообщение #29


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Forger @ Jun 15 2018, 13:58) *
Хотя, имхо, правильнее вообще избегать таких мутных дел и писать код более явно, чтобы любой компилятор правильно понял это. Да и читать такой код намного проще ))

Это верно. Но я имею таблицу приоритетов в файле, куда складываю "умные мысли", примеры на C (преимущественно с этого сайта). И периодически к ней обращаюсь, чтобы не писать лишних скобок. Увы, наизусть не выучил. Да и не хочу доверять памяти то, что можно доверить компьютеру.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 15 2018, 11:52
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(ViKo @ Jun 15 2018, 14:38) *
Но я имею таблицу приоритетов в файле, куда складываю "умные мысли",

Вот еще нашел любопытную таблицу: http://www.difranco.net/compsci/C_Operator...dence_Table.htm
Некоторые группы операторов тут имеют приоритет справа-налево, в отличие от большинства остальных групп.

Честно говоря, когда вижу в одном выражении смесь операторов "++/--" вместе с другими операторами, то стараюсь "от греха подальше" разделять их оператором ";" (на другую строку переносить).
Особенно это актуально при работе с указателями (операторы ->, *) - грабли с ними могут быть очень коварные smile3046.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016