|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 36)
|
Jun 14 2018, 14:14
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288

|
Цитата(Jenya7 @ Jun 14 2018, 17:12)  Я тут перевожу чужой код на новую платформу. Встретился такой код Код if(g_sPreset[g_uiCounterPush] < g_sPreset_max[g_uiCounterPush]) g_sPreset[g_uiCounterPush]++; как компилятор это увидит g_sPreset++ или g_sPreset[g_uiCounterPush++] ? Первое. Что логично.
|
|
|
|
|
Jun 14 2018, 14:49
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288

|
Цитата(Jenya7 @ Jun 14 2018, 17:25)  я понял. спасибо. судя по коду этот п...рограмист хотел таки приращивать g_uiCounterPush. хотя это то же самое. Ээээ... Что "то же самое"?
|
|
|
|
|
Jun 14 2018, 14:55
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
еще такой вопрос в aaa.h файле определено Код #if _MENU_C char *s_MainMenu[] = { "MAINT ", " AUTO ", "MANUAL", "FAILS ", }; #else extern char *s_MainMenu[]; #endif а в aaa.c файле #define _MENU_C есть шанс что дефайн будет виден в aaa.h файле? Цитата(gosha-z @ Jun 14 2018, 19:49)  Ээээ... Что "то же самое"? результат будет тот же. мы сместимся на один адрес вперед. .... ах да. ошибся. не то же самое.
Сообщение отредактировал Jenya7 - Jun 14 2018, 15:00
|
|
|
|
|
Jun 14 2018, 15:00
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288

|
Цитата(Jenya7 @ Jun 14 2018, 17:55)  еще такой вопрос в aaa.h файле определено Код #if _MENU_C char *s_MainMenu[] = { "MAINT ", " AUTO ", "MANUAL", "FAILS ", }; #else extern char *s_MainMenu[]; #endif а в aaa.c файле #define _MENU_C есть шанс что дефайн будет виден в aaa.h файле? Да, в случае #define _MENU_C #include "aaa.h" Цитата(Jenya7 @ Jun 14 2018, 17:55)  результат будет тот же. мы сместимся на один адрес вперед. Нет, a[b]++ и a[b++] разные по смыслу
|
|
|
|
|
Jun 14 2018, 16:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Jenya7 @ Jun 14 2018, 18:10)  а можно узнать что имел в виду писавший это? a[b]++ или таки a[b++]  интеллектуалам не понятно. Переписываем a[b]++; в виде a[b] = a[b] +1; По приоритету [] существенно выше чем оператор инкримента.
|
|
|
|
|
Jun 14 2018, 18:11
|

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

|
Цитата(Jenya7 @ Jun 14 2018, 17:12)  Я тут перевожу чужой код на новую платформу. Встретился такой код Код if(g_sPreset[g_uiCounterPush] < g_sPreset_max[g_uiCounterPush]) g_sPreset[g_uiCounterPush]++; как компилятор это увидит g_sPreset++ или g_sPreset[g_uiCounterPush++] ? См. приоритеты операторов. Оператор "[]" имеет приоритет, равный приоритету оператора "++". При равных приоритетах работает правило "слева направо". Т.е. сначала выполнится оператор [], а затем ++. Однако, в подобных не очевидных ситуациях, имхо, лучше писать явно: g_sPreset[g_uiCounterPush] = g_sPreset[g_uiCounterPush] + 1; Цитата(k155la3 @ Jun 14 2018, 19:10)  По приоритету [] существенно выше чем оператор инкримента. Это не так, приоритеты у них одинаковые )) Я тоже так думал, пока не глянул в "табличку" (см. ссылку выше)
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 14 2018, 18:21
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Forger @ Jun 15 2018, 00:11)  См. приоритеты операторов. Оператор "[]" имеет приоритет, равный приоритету оператора "++". При равных приоритетах работает правило "слева направо". Т.е. сначала выполнится оператор [], а затем ++. Однако, в подобных не очевидных ситуациях, имхо, лучше писать явно: g_sPreset[g_uiCounterPush] = g_sPreset[g_uiCounterPush] + 1; Это не так, приоритеты у них одинаковые )) Я тоже так думал, пока не глянул в "табличку" (см. ссылку выше) это не я писал. писал начинающий програмист. я не знаю что он имел ввиду. но сдается мне он далек от таких изысков g_sPreset[g_uiCounterPush] = g_sPreset[g_uiCounterPush] + 1;хотя...черт его душу разберет...
|
|
|
|
|
Jun 14 2018, 19:42
|

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

|
Цитата(gosha-z @ Jun 14 2018, 22:36)  Народ, вы чего? И то верно  Честно говоря, я решил, что речь идет про трактовку компилятором g_sPreset[g_uiCounterPush]++: либо (g_sPreset[g_uiCounterPush])++ либо (g_sPreset++)[g_uiCounterPush]. Если все же по теме, то ясен пень, что сначала выполнится то, что внутри оператора [ ], а потом и сам оператор [].
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 15 2018, 07:30
|
Профессионал
    
Группа: Свой
Сообщений: 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];
|
|
|
|
|
Jun 15 2018, 09:31
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 15 2018, 09:35
|

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

|
Цитата(ViKo @ Jun 15 2018, 10:15)  Для пост- и пре- ++ и - - там нет различий, это, видимо, позже придумали словоблуды (стандартизаторы) и шарлатаны из MS. Кстати, в стандарте что на этот счет? В стандарте С99 нет деления между постфиксным и префиксным инкрементом. Приоритет этих операций равен приоритету оператора []. В стандартах C++ префиксный операторы перенесли в группу приоритетов ниже. Постфиксные остались на прежнем месте. Т.е. как я и говорил постфиксный ++ имеет равный приоритет как и []. Не зависимо от стандарта. Не путайте народ! Вот ссылки для сравнения: http://ru.cppreference.com/w/c/language/operator_precedencehttp://ru.cppreference.com/w/cpp/language/...ator_precedence
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 15 2018, 09:53
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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
|
|
|
|
|
Jun 15 2018, 10:16
|

Профессионал
    
Группа: Свой
Сообщений: 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 ))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 15 2018, 10:58
|

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

|
Цитата(ViKo @ Jun 15 2018, 13:51)  Я по всякому искал, не нашел. Это удивляет. Увы, в стандарте нет явной precedence table, есть только жалкие крохи, которые еще больше запутывают. Я пришел к выводу, что каждый компилятор может некоторые нюансы трактовать по-своему. Другими словами стандарт "отдает это на откуп" разработчику компилятора. Поэтому подобные "мутные дела" лучше проверять на конкретном компиляторе. Хотя, имхо, правильнее вообще избегать таких мутных дел и писать код более явно, чтобы любой компилятор правильно понял это. Да и читать такой код намного проще ))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 15 2018, 11:38
|

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

|
Цитата(Forger @ Jun 15 2018, 13:58)  Хотя, имхо, правильнее вообще избегать таких мутных дел и писать код более явно, чтобы любой компилятор правильно понял это. Да и читать такой код намного проще )) Это верно. Но я имею таблицу приоритетов в файле, куда складываю "умные мысли", примеры на C (преимущественно с этого сайта). И периодически к ней обращаюсь, чтобы не писать лишних скобок. Увы, наизусть не выучил. Да и не хочу доверять памяти то, что можно доверить компьютеру.
|
|
|
|
|
Jun 15 2018, 11:52
|

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

|
Цитата(ViKo @ Jun 15 2018, 14:38)  Но я имею таблицу приоритетов в файле, куда складываю "умные мысли", Вот еще нашел любопытную таблицу: http://www.difranco.net/compsci/C_Operator...dence_Table.htmНекоторые группы операторов тут имеют приоритет справа-налево, в отличие от большинства остальных групп. Честно говоря, когда вижу в одном выражении смесь операторов "++/--" вместе с другими операторами, то стараюсь "от греха подальше" разделять их оператором ";" (на другую строку переносить). Особенно это актуально при работе с указателями (операторы ->, *) - грабли с ними могут быть очень коварные
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 15 2018, 12:42
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(k155la3 @ Jun 15 2018, 13:57)  IMHO: Использование постфиксных, и тем более - префиксных ++ в составе выражения ухудшает читабельность кода. Что в данном конкретном примере нечитабельно? Просто и наглядно: если значение в первом массиве меньше, чем соответствующее значение во втором, увеличиваем это значение. Как это можно понять по-другому?! А тема занятная получилась. Выяснилось, что приоритет операций в стандарте C99 явно не описан (наверное, его можно восстановить из форм Бэкуса-Наура, но уж больно лень) и он отличается (!) от приоритетов C++. Хотя, конечно, стандарты C++ писали неглупые люди и про совместимость они подумали. Лично я ни разу не наступил на грабли, пользуясь им в этой части при написании сишного кода.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Jun 15 2018, 14:11
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(esaulenka @ Jun 15 2018, 15:42)  Что в данном конкретном примере нечитабельно? В данном и конкретном все понятно. (Если речь о том, что в первом посте) Я в смысле применения к выражениям, Цитата a = b++ * 2 + b; на что IAR выдает Цитата Warning[Pa081]: undefined behavior: the order of read and modification of variable "b" (declared 1at line 72) (or a value reached by some form of indirection through it) is undefined in this statement main.c 79 Оттранслировалось ли ЭТО в код не проверял. Может кто более удачный пример "эффективного кода" приведет, не выдающего warning, error, но нечитабельного.
|
|
|
|
|
Jun 15 2018, 20:17
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(k155la3 @ Jun 15 2018, 17:11)  В данном и конкретном все понятно. (Если речь о том, что в первом посте)
Может кто более удачный пример "эффективного кода" приведет, не выдающего warning, error, но нечитабельного. Неоднозначность результата компилирования и читабельность кода - суть вещи разные. Приведенный Вами пример (a = b++ * 2 + b;) очень даже читабельный, хотя и неоднозначный.
|
|
|
|
|
Jun 15 2018, 20:21
|

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

|
Цитата(aiwa @ Jun 15 2018, 23:17)  пример (a = b++ * 2 + b;) очень даже читабельный, Неясно, что подразумевается под термином "читабельный": умение читать код или умение понимать прочитанное? Второе подразумевает явное знание работы компилятора и его действий. Если же поведение компилятора в том или ином случае сложно предсказать, то как ни старайся именовать курицу павлином , все равно курицей она так и останется
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 15 2018, 21:44
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(Forger @ Jun 15 2018, 23:21)  Неясно, что подразумевается под термином "читабельный": умение читать код или умение понимать прочитанное? Второе подразумевает явное знание работы компилятора и его действий. "Читабельность" - это совершенно субъективная инстанция, а работа компилятора - объективная. Но если подразумевать под "читабельностью" предсказание работы компилятора, то - да, нечитабельный: компилятор даже вправе генерить различный код для такого оператора в разных местах. Хотя пример лучше поменять на "а = b++ *2 + sin( b ); потому что старый можно оптимизировать в "а = b++ * 3;" воспользовавшись неоднозначностью порядка"
Сообщение отредактировал aiwa - Jun 15 2018, 21:45
|
|
|
|
|
Jun 15 2018, 21:55
|

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

|
Цитата(aiwa @ Jun 16 2018, 00:44)  ...да, нечитабельный Вот и я том же! Применение винегрета (из разношерстных операторов при неоправданной экономии скобок () в пределах одного оператора ";") - любой код сделает нечитабельным, нечитаемым и т. п. Озвучивать название такому "коду" тут запрещено правилами форума, но, я уверен, что все понимают о чем речь  Потому возникает риторический вопрос: есть ли вообще смысл анализировать подобный "код", когда сходу сразу понятно, что нифига не понятно? ... А всего-то достаточно добавить несколько пар скобок или операторов ";" с соотв. переносом строки, чтобы напрочь закрыть любую "необъективность" даже самого "упоротого" кода.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|