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

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


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я тут перевожу чужой код на новую платформу. Встретился такой код
Код
if(g_sPreset[g_uiCounterPush] < g_sPreset_max[g_uiCounterPush])
    g_sPreset[g_uiCounterPush]++;
как компилятор это увидит g_sPreset++ или g_sPreset[g_uiCounterPush++] ?

Go to the top of the page
 
+Quote Post
gosha-z
сообщение Jun 14 2018, 14:14
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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++] ?

Первое. Что логично.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 14 2018, 14:25
Сообщение #3


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(gosha-z @ Jun 14 2018, 19:14) *
Первое. Что логично.


я понял. спасибо. судя по коду этот п...рограмист хотел таки приращивать g_uiCounterPush. хотя это то же самое.

Сообщение отредактировал Jenya7 - Jun 14 2018, 14:34
Go to the top of the page
 
+Quote Post
gosha-z
сообщение Jun 14 2018, 14:49
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288



Цитата(Jenya7 @ Jun 14 2018, 17:25) *
я понял. спасибо. судя по коду этот п...рограмист хотел таки приращивать g_uiCounterPush. хотя это то же самое.

Ээээ... Что "то же самое"?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 14 2018, 14:55
Сообщение #5


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

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
gosha-z
сообщение Jun 14 2018, 15:00
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 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++] разные по смыслу


Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 14 2018, 15:10
Сообщение #7


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(gosha-z @ Jun 14 2018, 20:00) *
Да, в случае
#define _MENU_C
#include "aaa.h"

Нет, a[b]++ и a[b++] разные по смыслу
а можно узнать что имел в виду писавший это? a[b]++ или таки a[b++]
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 14 2018, 16:10
Сообщение #8


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

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



Цитата(Jenya7 @ Jun 14 2018, 18:10) *
а можно узнать что имел в виду писавший это? a[b]++ или таки a[b++]
sm.gif интеллектуалам не понятно.
Переписываем
a[b]++;
в виде a[b] = a[b] +1;
По приоритету [] существенно выше чем оператор инкримента.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 14 2018, 18:11
Сообщение #9


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

Группа: Свой
Сообщений: 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) *
По приоритету [] существенно выше чем оператор инкримента.

Это не так, приоритеты у них одинаковые ))
Я тоже так думал, пока не глянул в "табличку" (см. ссылку выше)


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


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

Группа: Участник
Сообщений: 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;хотя...черт его душу разберет...
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 14 2018, 18:24
Сообщение #11


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

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



Цитата(Jenya7 @ Jun 14 2018, 21:21) *
это не я писал. писал начинающий програмист
А сам этот "программист" куда-то пропал?


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


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

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



Цитата(Forger @ Jun 14 2018, 21:11) *
Это не так, приоритеты у них одинаковые ))
Я тоже так думал, пока не глянул в "табличку" (см. ссылку выше)

Приоритеты у них разные, а табличка у вас неправильная. rolleyes.gif
Не "существенно выше" sm.gif , а на одну позицию.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 14 2018, 19:12
Сообщение #13


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

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



Цитата(ViKo @ Jun 14 2018, 22:05) *
Приоритеты у них разные, а табличка у вас неправильная. rolleyes.gif

Значит msdn тоже врет, все врут! Но коли так, покажите свою "правильную" табличку cool.gif


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


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288



Народ, вы чего? Там все однозначно безо всяких толкований. a[b++] - инкрементим индекс, не трогая элемент массива, a[b]++ - инкрементим элемент, не трогая индекс. Любой другой вариант уже начинает попахивать нарушением MISRA C Rule 12.2
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 14 2018, 19:42
Сообщение #15


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

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



Цитата(gosha-z @ Jun 14 2018, 22:36) *
Народ, вы чего?

И то верно blink.gif

Честно говоря, я решил, что речь идет про трактовку компилятором g_sPreset[g_uiCounterPush]++: либо (g_sPreset[g_uiCounterPush])++ либо (g_sPreset++)[g_uiCounterPush]. blush.gif


Если все же по теме, то ясен пень, что сначала выполнится то, что внутри оператора [ ], а потом и сам оператор [].


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

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

 


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


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