powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ручное назначение номеров индексов массива
25 сообщений из 93, страница 2 из 4
Ручное назначение номеров индексов массива
    #39270967
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryBagaBagaпропущено...


Можно попробовать выстрелить себе в ногу

Код: plaintext
1.
2.
3.
4.
5.
    int ar[4]  = {1,2,3,4};
    int *p_ar = &ar[0]-2000;

    p_ar[2000] = 100;
    p_ar[2001] = 100;


но нужно ли?

И зачем так пробовать? Разве в данном случае мы не имеем ub?

Там же сказано - выстрелить себе в ногу :)

Это классический (можно сказать - бородатый) трюк со времен С. И да, это UB, если следовать букве стандарта. По стандарту, если вы уж получили непрерывные кусок памяти (в т.ч. массив), то вся ваша адресная арифметика должна уложиться "внутрь" выделенного непрерывного диапазона адресов. Например, вот такой код
Код: plaintext
1.
2.
3.
4.
5.
int a, b;
int *a = &a;
int *b = &b;

b-a;


тоже UB в чистом виде.

Этот UB можно наглядно словить, если вы "захотите обработать" больше сегмента. Или если вдруг "разность" должна стать отрицательным числом... Что тогда будет, ведь отрицательных адресов не бывает? (подсказка - скорее всего "улетите" в чужой сегмент).

Но к несчастью, в большинстве случаев на x86 этот UB работает так, как ожидается )
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39271629
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga Это классический (можно сказать - бородатый) трюк со времен С.

Может быть (хотя трюки должны быть законными). Было бы интересно увидеть где этот "трюк" встречается (увидеть отсылку времен K&R к такому примеру) и как его комментируют авторы
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39273844
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryBagaBaga Это классический (можно сказать - бородатый) трюк со времен С.

Может быть (хотя трюки должны быть законными). Было бы интересно увидеть где этот "трюк" встречается (увидеть отсылку времен K&R к такому примеру) и как его комментируют авторы

SashaMercury, ты не поверишь, но трюки никому ничего не должны :) Более того, большинство из них по определению UB. Ну вот взять хоть те же трюки по доступу к закрытым полям класса. Как их сделать без UB? Никак :)

Во времена K&R, на сколько я знаю, интернета не было. Так что дать ссылку на первоисточник вряд ли можно. Этот трюк встречался в разных кодах, но популяризировали его, скорее всего, авторы книги Numerical Recipes in C. В новых переизданиях этот трюк убрали как не совсем соответсвующий стандарту.

PS
Да, к стати, никого не смущает, что итератор end() указывает _ЗА_ последний элемент? Похоже, что именно для этой практики в адресной арифметике в стандарте сделано исключение - можно получать (про разъыменовывать - ни ни) адрес, на один элемент больший, чем последний адрес выделенной непрерывной области. Иначе пришлось бы "закопать" весь STL :))
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39273858
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaSashaMercuryпропущено...


Может быть (хотя трюки должны быть законными). Было бы интересно увидеть где этот "трюк" встречается (увидеть отсылку времен K&R к такому примеру) и как его комментируют авторы

SashaMercury, ты не поверишь, но трюки никому ничего не должны :) Более того, большинство из них по определению UB. Ну вот взять хоть те же трюки по доступу к закрытым полям класса. Как их сделать без UB? Никак :)


У нас с вами разные определения для этого слова. На мой взгляд трюк это что-то законное, но не явное.

BagaBagaВо времена K&R, на сколько я знаю, интернета не было. Так что дать ссылку на первоисточник вряд ли можно. Этот трюк встречался в разных кодах, но популяризировали его, скорее всего, авторы книги Numerical Recipes in C. В новых переизданиях этот трюк убрали как не совсем соответсвующий стандарту.


Вы выше писали про то, что трюки не обязаны соответствовать стандарту, более того, по определению ub

BagaBagaPS
Да, к стати, никого не смущает, что итератор end() указывает _ЗА_ последний элемент? Похоже, что именно для этой практики в адресной арифметике в стандарте сделано исключение - можно получать (про разъыменовывать - ни ни) адрес, на один элемент больший, чем последний адрес выделенной непрерывной области. Иначе пришлось бы "закопать" весь STL :))

Мне кажется что в данной ситуации все ровно наоборот
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39273869
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И конечно возможность проводить сравнение с элементов следующим за последним элементов скорее всего связана с устоявшейся традицией работать с полуоткрытыми интервалами при непосредственном кодировании и разработке алгоритмов [a,b), т.о. классический цикл в качестве шаблона будет иметь следующий вид:
for(T i=0;i<n;++i){
smth do
}

из чего следует необходимость распространения арифметики указателей на элемент после последнего элемента массива
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274161
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВы выше писали про то, что трюки не обязаны соответствовать стандарту, более того, по определению ub

SashaMercury,
вы как-то интересно надёргиваете мои слова. Я ни где не писал, что ВСЕ трюки - UB. Как и то, что все UB - трюки... Неужели нужно переформулировать? Ок: большинство трюков (нужно ли уточнять, что из тех, что я видел?) являются UB по определению UB.

SashaMercuryУ нас с вами разные определения для этого слова. На мой взгляд трюк это что-то законное, но не явное.

Можно подумать, UB - это что-то незаконное :). UB это всего лишь UB. Стандарт регламентирует ряд ситуаций. Есть ситуации, которые стандарт отказывается регламентировать. Эти ситуации и есть Undefined стандартом Behavior, т.е. по-просту неопределённые. Это значит, что в этих ситуациях может произойти что угодно, и это "что угодно" будет законным. И зависеть от усмотрения разработчика (компилятора).
Например,
Код: plaintext
1.
2.
3.
4.
void main()
{
  return;
}


чистой воды UB, но при этом этот код спокойно откомпилируется компиляторами от MS, от Borland (а, ну да - Embarcadero), но тот же gcc выдаст ошибку компиляции ))

SashaMercuryBagaBagaPS
Да, к стати, никого не смущает, что итератор end() указывает _ЗА_ последний элемент? Похоже, что именно для этой практики в адресной арифметике в стандарте сделано исключение - можно получать (про разъыменовывать - ни ни) адрес, на один элемент больший, чем последний адрес выделенной непрерывной области. Иначе пришлось бы "закопать" весь STL :))
Мне кажется что в данной ситуации все ровно наоборот
Что - ровно наоборот?
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274167
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИ конечно возможность проводить сравнение с элементов следующим за последним элементов скорее всего связана с устоявшейся традицией работать с полуоткрытыми интервалами при непосредственном кодировании и разработке алгоритмов [a,b), т.о. классический цикл в качестве шаблона будет иметь следующий вид:
for(T i=0;i<n;++i){
smth do
}

из чего следует необходимость распространения арифметики указателей на элемент после последнего элемента массива

Вот из чего что следует, тут совершенно непонятно )))

Вы привели классический пример цикла из С и С++. Вот только он не соответствует устоявшейся практике разработчиков STL. Загляните, там полно другого кода, всё больше в стиле
Код: plaintext
1.
2.
3.
4.
while(it != v.end()){
   ...
   ++it;
}


Обратите внимание, типовая реализация от STL требует только наличия оператора сравнения на равенство (ну, или неравенство). Ваш же цикл требует значительно большего - он требует не только сравнимости равно - не равно (как в STL), но и упорядоченности (какой из двух элементов больше). Причём, строгой :)). Что может вызвать некоторые проблемы, причём ровно те же, что и UB в решении с трюком-на-указателях :)
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274170
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaВот из чего что следует, тут совершенно непонятно )))
Очень даже понятно. Если последний элемент занимает последние байты адресного пространства, то это бесконечный цикл, т.к. ++ уведет в начало.
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274180
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
следуйте соглашениям STL и используйте "!=" вместо "<" - тогда и "бесконечного цикла" не будет :)
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274222
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga, у нас здесь не курица с яйцом и не сообщество благородных девиц Сорбонны, потому софистикой заниматься мне не интересно. Вы безусловно можете оставаться при своем мнении
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274223
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga Ваш же цикл требует значительно большего - он требует не только сравнимости равно - не равно (как в STL), но и упорядоченности (какой из двух элементов больше). Причём, строгой :)). Что может вызвать некоторые проблемы, причём ровно те же, что и UB в решении с трюком-на-указателях :)


Приведите пожалуйста пример
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274337
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryBagaBaga, у нас здесь не курица с яйцом и не сообщество благородных девиц Сорбонны, потому софистикой заниматься мне не интересно. Вы безусловно можете оставаться при своем мнении
Софистикой здесь занимаетесь только вы. Укажите на пункт стандарта, запрещающий UB, и тогда я с вами соглашусь. Но вы такого не найдёте.
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274345
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryBagaBaga Ваш же цикл требует значительно большего - он требует не только сравнимости равно - не равно (как в STL), но и упорядоченности (какой из двух элементов больше). Причём, строгой :)). Что может вызвать некоторые проблемы, причём ровно те же, что и UB в решении с трюком-на-указателях :)


Приведите пожалуйста пример

Вам же привели пример
Dima TЕсли последний элемент занимает последние байты адресного пространства, то это бесконечный цикл, т.к. ++ уведет в начало.
Вам достаточно подобрать такой адрес, когда it < end() заведомо не выполнится. Т.е. в (it+1) будет происходить переполнение, и "неожиданно" (it+1) < it < end() :)
Как думаете, что выдаст в качестве значения "с"
Код: plaintext
1.
2.
3.
char c = 0
for(; c < 255; c++)
;


такой код? Всегда ли он вернёт одно и то же? Зависит ли возвращаемое от чего-либо? Вернёт ли он что либо? )))
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274448
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga, я рискну предположить что данный UB относится не к циклам и шаблону итераторов,
а к переполнению разрядной сетки в принципе.

Я предлагаю участника вообще закрыть это направление. Тем более что градус напряжения в сабже поднялся,
а сегдня - пятница и надо ходить в гавайской рубашке и шортах и быть няшкой и вообще...
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274591
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
рискну предположить, что "проблемы трюка - с - указателем" как раз и проявляются из-за необработки "переполнения" - выхода результирующего адреса за диапазон допустимых значений (e.g., за границы выделенного сегмента).

SashaMercury привёл код
SashaMercuryт.о. классический цикл в качестве шаблона будет иметь следующий вид:
for(T i=0;i<n;++i){
smth do
}

и попросил меня
SashaMercuryBagaBaga ... Что может вызвать некоторые проблемы, причём ровно те же, что и UB в решении с трюком-на-указателях :)

Приведите пожалуйста пример

показать его проблемы. Для чего мне пришлось привести пример,
Код: plaintext
1.
2.
3.
for(char i=0; i < 255;++i){
smth do
}



полностью повтояющий структуру приведённого т.н. "классического цикла", но при этом являющийся UB в чистом виде.

PS
Я только за гавайские рубашки :)
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274595
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли последний элемент занимает последние байты адресного пространства, то это бесконечный цикл, т.к. ++ уведет в начало.
А можете привести пример в котором создается такая ситуация ? )))
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274604
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga, ваши контрпримеры неудачны. Придумайте что-нибудь получше ;)
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274627
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryBagaBaga, ваши контрпримеры неудачны. Придумайте что-нибудь получше ;)
Ну так и давайте по пунктам:
- в чём конкретно они неудачны и почему:
- на основании каких критериев сделаны такие выводы;
- откуда вообще эти "критерии" взялись? Желательно, со ссылками на стандарт.

И да, где ссылка на пункт стандарта, утверждающего "UB - это незаконно"? :) Вы же так обильно его цитируете, приведите и здесь )
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274717
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaSashaMercuryBagaBaga, ваши контрпримеры неудачны. Придумайте что-нибудь получше ;)
Ну так и давайте по пунктам:
- в чём конкретно они неудачны и почему:
- на основании каких критериев сделаны такие выводы;
- откуда вообще эти "критерии" взялись? Желательно, со ссылками на стандарт.

И да, где ссылка на пункт стандарта, утверждающего "UB - это незаконно"? :) Вы же так обильно его цитируете, приведите и здесь )

Неудачны потому, что ничего не доказывают. Мне кажется, что ваш пример скорее относится к implementation-defined behavior, нежели к ub. Но это не существенно в любом случае, т.к. из этого не следует что именно операция сравнения привела к этому. Можно привести аналогичный пример с операцией сравнения.

Такого пункта в стандарте быть не может(в явном виде), так-же как и нет такого закона, который запрещает кому-либо спрыгнуть с 5 этажа. И вы это прекрасно знаете, т.о. вы намеренно ставите это утверждение как центральное по этому вопросу, значит вы намеренно занимаетесь софистикой. И никаких критериев относительно качества контрпримеров в стандарте языка очевидно быть не может. Еще один странный вопрос.

Что вы пытаетесь доказать? Что ub это норма? Так вот, это такая-же норма как и поведение того идиота в Ницце. Вчера он обыкновенный тунисец, а сегодня он давит людей. Вчера этот участок кода работал, сегодня вы имеете крах программы или что-нибудь похуже.
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39274746
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНеудачны потому, что ничего не доказывают. ... из этого не следует что именно операция сравнения привела к этому.
Именно операция сравнения знакового char и беззнакового 255 привела к UB. Но для вас, так и быть, "из этого не следует"...

Модератор: Прекращайте спорить
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39275980
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ukugyul552465К примеру, есть массив int numbers[4], он состоит из элементов:
numbers[0];
numbers[1];
numbers[2];
numbers[3];
Можно ли переназначить индекс элементов, чтобы массив int numbers[4] состоял из элементов:
numbers[2000];
numbers[2001];
numbers[2002];
numbers[2003].Можно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
int numbers[4];

inline int* number_for_year(int year) {
  assert((2000 <= year) && (year <= 2003));
  return &numbers[year - 2000];
}

int main() {
  *number_for_year(2000) = 3;
  assert(*number_for_year(2000) == 3);
  return 0;
}


BagaBagaМожно подумать, UB - это что-то незаконное :). UB это всего лишь UB. Стандарт регламентирует ряд ситуаций. Есть ситуации, которые стандарт отказывается регламентировать. Эти ситуации и есть Undefined стандартом Behavior, т.е. по-просту неопределённые. Это значит, что в этих ситуациях может произойти что угодно, и это "что угодно" будет законным. И зависеть от усмотрения разработчика (компилятора).По-моему, вы смешиваете две принципиально разные вещи -- unspecified behavior и undefined behavior. Undefined behavior плохо тем, что оптимизирующий компилятор полагается на то, что оно не случается. Например, есть код:
Код: plaintext
1.
2.
3.
4.
5.
6.
int n = ...;
if (n < n + 1) {
  ...
} else {
  handle_overflow();
}

Знаковое (signed) переполнение -- это undefined behavior, оптимизирующий компилятор полагается на то, что оно не случается. Значит, условие в if -- всегда true, его можно не проверять, а вызов функции handle_overflow -- вообще выкинуть.
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39277594
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовПо-моему, вы смешиваете две принципиально разные вещи -- unspecified behavior и undefined behavior. Undefined behavior плохо тем, что оптимизирующий компилятор полагается на то, что оно не случается. Например, есть код:
Код: plaintext
1.
2.
3.
4.
5.
6.
int n = ...;
if (n < n + 1) {
  ...
} else {
  handle_overflow();
}

Знаковое (signed) переполнение -- это undefined behavior, оптимизирующий компилятор полагается на то, что оно не случается. Значит, условие в if -- всегда true, его можно не проверять, а вызов функции handle_overflow -- вообще выкинуть.

Пётр, чесслово, очень хотелось бы увидеть на русском "на пальцах" (но без "распальцовки :) ) объяснение, что же такое undefined behavior, unspecified behavior, и на каких критериях (желательно, всё же формальных, а то ведь скатимся до "я ТАК вижу") и тест-кейсах можно отличить одно от другого.

Если честно, мне немного непривычно, что в качестве примера unspecified behavior вы привели результаты работы оптимизатора. Оптимизатор, это такая "вещь в себе", что его работа остаётся загадкой - т.к. зависит от набора доступных ему правил преобразования кода и умения "распознавать" .. клише, что-ли... для оптимизации. И первое, и последнее зависят от разработчиков. Но на первое мы можем влиять через ключи. Правда, мало кто на себе (на своём коде, конечно же) прочувствовал, что выбирая опцию выше O2 собственноручно позволяешь ему произвести ... как бы это ... исполняемый, но неработающий как ожидается код :)

Как думаете, прав ли будет оптимизатор, выкидывая конструкцию вида
Код: plaintext
1.
2.
3.
4.
5.
double d = 1;
...
if(d !=d){
    //process THAT case
}


?

А удивление моё вызвано простой вещью. Существует очень старый, ещё со времён С, пример. Как думаете, что вернёт код
Код: plaintext
1.
2.
3.
int i = 0;
auto f = [](const int a, const int b)->bool{return a > b;};
cout << f(++i,++i);
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39278283
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaПётр, чесслово, очень хотелось бы увидеть на русском "на пальцах" (но без "распальцовки :) ) объяснение, что же такое undefined behavior, unspecified behavior, и на каких критериях (желательно, всё же формальных, а то ведь скатимся до "я ТАК вижу") и тест-кейсах можно отличить одно от другого.Да я просто в Wikipedia-и читал:
undefined behavior
unspecified behavior
Ну и в русско-язычной Wikipedia-и тоже есть статьи. Ещё есть статья на cppreference.com. Хотя если глубоко разбираться, то надо стандарт C++ читать, но там много букв.

BagaBagaЕсли честно, мне немного непривычно, что в качестве примера unspecified behavior вы привели результаты работы оптимизатора.Там было про undefined behavior :).

BagaBagaКак думаете, прав ли будет оптимизатор, выкидывая конструкцию вида
Код: plaintext
1.
2.
3.
4.
5.
double d = 1;
...
if(d !=d){
    //process THAT case
}


?Думаю, прав. Здесь же нет volatile, поэтому можно выкинуть if. Вот если написать «volatile double d = 1;», то компилятор должен сохранить if, потому что мы сообщили ему, что другой поток (thread) может в любой момент изменить значение переменной d.

BagaBagaА удивление моё вызвано простой вещью. Существует очень старый, ещё со времён С, пример. Как думаете, что вернёт код
Код: plaintext
1.
2.
3.
int i = 0;
auto f = [](const int a, const int b)->bool{return a > b;};
cout << f(++i,++i);

В последней строке -- два побочных эффекта на одну и ту же переменную, это undefined behavior, насколько я понимаю. Так что неизвестно, что тут будет происходить, и этот код надо переписать. Ну и в старом C-шном коде не может быть лямбды :).
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39278964
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовBagaBagaЕсли честно, мне немного непривычно, что в качестве примера unspecified behavior вы привели результаты работы оптимизатора.Там было про undefined behavior :).

тогда согласен :)

Пётр Седов
BagaBagaКак думаете, прав ли будет оптимизатор, выкидывая конструкцию вида
Код: plaintext
1.
2.
3.
4.
5.
double d = 1;
...
if(d !=d){
    //process THAT case
}


?Думаю, прав. Здесь же нет volatile, поэтому можно выкинуть if. Вот если написать «volatile double d = 1;», то компилятор должен сохранить if, потому что мы сообщили ему, что другой поток (thread) может в любой момент изменить значение переменной d.

volatile здесь совершенно непричем. И нет ни слова о многопоточности. Этот код - x!=x - не что иное как полный аналог isnan(x). NaN - это единственное число, коротое не равно самому себе :) Так что будет выкинута проверка получения не-числа...

Пётр СедовBagaBagaА удивление моё вызвано простой вещью. Существует очень старый, ещё со времён С, пример. Как думаете, что вернёт код
Код: plaintext
1.
2.
3.
int i = 0;
auto f = [](const int a, const int b)->bool{return a > b;};
cout << f(++i,++i);

В последней строке -- два побочных эффекта на одну и ту же переменную, это undefined behavior, насколько я понимаю. Так что неизвестно, что тут будет происходить, и этот код надо переписать. Ну и в старом C-шном коде не может быть лямбды :).
Про лямбду. Замените её на функцию :) Это просто чтобы "визуально омолодить" пример и сэкономить пару строк на экране. В стандарте С++ (и С - тоже) порядок вычисления аргументов, переданных в функцию, unspecified. Результат, взвращаемый данной функцией, корректен, но завсист от прядка вычисления аргументов. Так что это был пример на unspecified behavior. Ради интереса, попробуйте скомпилировать его же на компиляторе MS C++ под x86 и под ARM - получите разные результаты :) Его можно (при желании) привратить в UB, если допустить вычисление параметров конкурентно в __разных__ потоках (вот тогда получим UB из-за "одновременного" доступа к "незащищённой" переменной из разных потоков...), вот только ни один компилятор, на сколько я знаю, такого извращения не делает :)
...
Рейтинг: 0 / 0
Ручное назначение номеров индексов массива
    #39278971
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagavolatile здесь совершенно непричем. И нет ни слова о многопоточности.
volatile в С/С++ к многопоточности не имеет отношения. volatile означает нестандартная память, т.е. "не оптимизировать и перечитывать при каждом обращении", например в память проецируется показания каких-то датчиков и каждый их опрос вызывает какое-то действие.
...
Рейтинг: 0 / 0
25 сообщений из 93, страница 2 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ручное назначение номеров индексов массива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]