Перейти к содержанию
    

Я тут перевожу чужой код на новую платформу. Встретился такой код

if(g_sPreset[g_uiCounterPush] < g_sPreset_max[g_uiCounterPush])
    g_sPreset[g_uiCounterPush]++;

как компилятор это увидит g_sPreset++ или g_sPreset[g_uiCounterPush++] ?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

как компилятор это увидит g_sPreset++ или g_sPreset[g_uiCounterPush++] ?

Первое. Что логично.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первое. Что логично.

 

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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Ээээ... Что "то же самое"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

еще такой вопрос

в 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 файле?

 

Ээээ... Что "то же самое"?

результат будет тот же. мы сместимся на один адрес вперед. .... ах да. ошибся. не то же самое.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

еще такой вопрос

в 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"

результат будет тот же. мы сместимся на один адрес вперед.

 

Нет, a++ и a[b++] разные по смыслу

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, в случае

#define _MENU_C

#include "aaa.h"

 

Нет, a++ и a[b++] разные по смыслу

а можно узнать что имел в виду писавший это? a++ или таки a[b++]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а можно узнать что имел в виду писавший это? a++ или таки a[b++]
:) интеллектуалам не понятно.

Переписываем

a++;

в виде a = a +1;

По приоритету [] существенно выше чем оператор инкримента.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я тут перевожу чужой код на новую платформу. Встретился такой код
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;

 

По приоритету [] существенно выше чем оператор инкримента.

Это не так, приоритеты у них одинаковые ))

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

См. приоритеты операторов. Оператор "[]" имеет приоритет, равный приоритету оператора "++".

При равных приоритетах работает правило "слева направо". Т.е. сначала выполнится оператор [], а затем ++.

Однако, в подобных не очевидных ситуациях, имхо, лучше писать явно: g_sPreset[g_uiCounterPush] = g_sPreset[g_uiCounterPush] + 1;

 

 

Это не так, приоритеты у них одинаковые ))

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

 

это не я писал. писал начинающий програмист. я не знаю что он имел ввиду. но сдается мне он далек от таких изысков g_sPreset[g_uiCounterPush] = g_sPreset[g_uiCounterPush] + 1;хотя...черт его душу разберет...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не так, приоритеты у них одинаковые ))

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

Приоритеты у них разные, а табличка у вас неправильная. :rolleyes:

Не "существенно выше" :) , а на одну позицию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приоритеты у них разные, а табличка у вас неправильная. :rolleyes:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Народ, вы чего? Там все однозначно безо всяких толкований. a[b++] - инкрементим индекс, не трогая элемент массива, a++ - инкрементим элемент, не трогая индекс. Любой другой вариант уже начинает попахивать нарушением MISRA C Rule 12.2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Народ, вы чего?

И то верно :blink:

 

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

 

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...