powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Порядок вычисления
25 сообщений из 110, страница 2 из 5
Порядок вычисления
    #38822952
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, надеюсь что этот кейс настолько редкий
чтобы не ощущать damage на уровне статистики.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822953
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyС точки зрения выполнения, присвоение - это вызов функции с двумя аргументами. В каком порядке вычислять аргументы - не имеет значения, главное чтобы все аргументы были готовы на момент вызова.Тогда, единственным логичным выбором остаётся "неопределённое поведение".
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822958
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovAnatoly MoskovskyТогда, единственным логичным выбором остаётся "неопределённое поведение".
Это было бы так если бы устранение UB вносило бы оверхед.
Но по факту легко задать определенное поведение для случая присвоения не внося оверхед.
А значит это надо сделать.
Потому что как я выше писал встречаются нетривиальные и вполне непротиворечивые варианты этого кейса, и наказывать программиста за непреднамеренное применение - бессмысленно.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822991
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovegorychпорядок вычисления аргументов функции не определён, жеж, а тут получается,
что мы взяли, и сказали, что вот именно для оператора присваивания - определён. нехорошо
как то, имхо ))
Ещё со времён K&R оператор присваивания вычисляется справа налево.

PS: Порядок вычисления аргументов функции определяется соглашением о вызове.


это неправда. две неправды.

= выполняется справа налево, а не вычисляется.

параметры передаются в определенном порядке, а не вычисляются.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822992
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovegorychв С операторы - не функции, K&R не имеют отношения к C++, не видишь не
стыковки? ))
Операторы возвращают значение? Возвращают. Значит - функции.



Дима! Ну ты же грамотный человек, зачем такую хрень пишешь?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38822994
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сам за Undefined. Так прямо Гербу и отписал...
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823017
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНапример убрать тернарный оператор, чтобы SashaMercury не злоупотрелбял им не, я тоже люблю тернарный оператор, святое не трожь!
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823018
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВ таком случае надо запретить много чего, чтоб стиль не портить.я бы C-style каст бы запретил бы уже ))
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823031
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЭто было бы так если бы устранение UB вносило бы оверхед.
Но по факту легко задать определенное поведение для случая присвоения не внося оверхед.
А значит это надо сделать.Устранить неопределённость, значит разрешить использование.Потому что как я выше писал встречаются нетривиальные и вполне непротиворечивые варианты этого кейса, и наказывать программиста за непреднамеренное применение - бессмысленно.Неправда.
Если я создал "псевдоним", то на меня же ложиться и ответственность за "множественное использование".
"Сложно отследить" - не оправдание. Это жестко и не совсем практично, но именно такой подход является единственно правильным.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823033
Alca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посчему здесь UB?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823044
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyК сожалению, в реальных программах этот кейс встречается в основном в неявном виде, типа этого.
Код: plaintext
1.
2.
int& j = i; // где-то в другой функции
v[j++] = i++;

Отследить алиасинг не всегда возможно.Толку убирать UB, если простое переписывание "подозрительного" кода на "определённый":
Код: sql
1.
2.
3.
4.
int& j = i; //где-то там
v[j] = i;
i += 1;
j += 1;

ставит нас на грабли?
Может просто не использовать замысловатые инкременты для переменных "вне подконтрольной области"?
Тем более, что если уж бороться за эффективность, то постинкремент должен быть предан анафеме
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823128
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovТолку убирать UB, если простое переписывание "подозрительного" кода на "определённый"
Толк в том чтобы помочь программисту, а не мешать.
Когда есть код с такой проблемой то это почти наверняка баг.
И разрешать каждой платформе по разному выполнять этот код - это затрудняет поиск бага.
Хотя ничего не мешает именно в данном конкретном случае задать определенное поведение (любое).
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823168
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТолк в том чтобы помочь программисту, а не мешатьПрограммирование всё больше и больше становится производством кода. На любом производстве есть правила техники безопасности, которые могут мешать и мешают эффективному производству.
В данном конкретном случае я бы сформулировал примерно так: "более одного выражения с побочным эффектом в одном операторе - неопределённое поведение".
Да, можно тем или иным способом доопределить поведение компилятора, но "потрудитесь излагать яснее, кто на ком стоял". Нет проблемы превратить невнятное:
Код: sql
1.
2.
3.
std::vector<int> v = { 0, 0 };
int i = 0;
v[i++] = i++;

в более определённое:
Код: sql
1.
v[i] = i, i++;

или в любой другой из, возможно подразумевавшихся, вариантов:
Код: sql
1.
v[i] = i, ++i;

Ни пальцы не сотрутся, ни ум за разум не зайдёт.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823334
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlcaПосчему здесь UB?

По современному стандарту модификация одной и той же переменной более одного раза до точки следования является UB.
Кажется, так.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823341
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyBasil A. SidorovТолку убирать UB, если простое переписывание "подозрительного" кода на "определённый"
Толк в том чтобы помочь программисту, а не мешать.
Когда есть код с такой проблемой то это почти наверняка баг.
И разрешать каждой платформе по разному выполнять этот код - это затрудняет поиск бага.
Хотя ничего не мешает именно в данном конкретном случае задать определенное поведение (любое).

Я лично резко против такого подхода.

В приведённом в оригинальном посте примере написан код, которого вообще не должно быть в нормальной программе.
В чём преимущество написать этот код именно так ? НИ В ЧЁМ, это просто дешёвые понты старого С-шника. Типа -- а и вот так заверну.

Так что UB.

Там кстати в оригинальном посте даже картинку запостили:
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823345
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov....в более определённое:
Код: sql
1.
2.
v[i] = i, i++;
v[i] = i, ++i;

Ни пальцы не сотрутся, ни ум за разум не зайдёт.
У кого как. У меня заходит.

ВикипедияIn the C and C++ programming languages, the comma operator (represented by the token ,) is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type).

в чем сакральный смысл записи "i,i++" ?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823353
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevBasil A. Sidorov....в более определённое:
Код: sql
1.
2.
v[i] = i, i++;
v[i] = i, ++i;

Ни пальцы не сотрутся, ни ум за разум не зайдёт.
У кого как. У меня заходит.

ВикипедияIn the C and C++ programming languages, the comma operator (represented by the token ,) is a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type).

в чем сакральный смысл записи "i,i++" ?

Тут -- ни в чём. Можно заменить на ' ; '
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823420
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мне показалось смысл в том, что бы "взорвать мозг".

Вообще, мне кажется, весь топик этому посвящен. Какой-то топик для брюнеток, которые хотят уметь "взрывать мозг" как блондинки (блондинки это с рождения умеют). Только не понятно, при чем тут C и компилятор. IMHO
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823465
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор пишет:

авторMy question is not what it might print under today’s C++ rules.
The third line runs afoul of two different categories of undefined
and unspecified behavior.

Rather, my question is what you would like the result to be.
Please let me know.

Поправьте меня в моём английском если что.

Но он спрашивает - "Какой-бы результат вам хотелось-бы получить на выходе?"
Это философия. Дискурс. Мозговой штурм. Сбор мнений соц-опрос.

Так я думаю.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823626
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivAlcaПосчему здесь UB?

По современному стандарту модификация одной и той же переменной более одного раза до точки следования является UB.
Кажется, так.
Кстати, а можно как-то настроить msvc, gcc или clang отлавливать такие warning-и, чтобы компиляция дальше не проходила?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823628
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovТем более, что если уж бороться за эффективность, то постинкремент должен быть предан анафеме
А почему бы действительно не отказаться от постинкремента, есть ли вообще случаи когда без него не обойтись или он заметно что-то облегчает?
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823643
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВ приведённом в оригинальном посте примере написан код, которого вообще не должно быть в нормальной программе.
В чём преимущество написать этот код именно так ? НИ В ЧЁМ, это просто дешёвые понты старого С-шника. Типа -- а и вот так заверну.
В оригинальном посте показан минимальный пример демонстрирующий проблему в явном виде.
В реальных программах проблема не так очевидна.

Например, недавно тут обсуждался код, против которого ни у кого не возникало никаких возражений:
Код: plaintext
1.
*str1++ = *str2++;



Но тут возможна та же самая проблема, если str1 является ссылкой на str2, потому что данный код эквивалентен такому:
Код: plaintext
1.
2.
int& i = j;
str1[i++] = str2[j++];


Это баг, что нет проверки на равенство, но из-за UB его можете не сразу заметить.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823657
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Например, недавно тут обсуждался код, против которого ни у кого не возникало никаких возражений:
Код: plaintext
1.
*str1++ = *str2++;




Не надо преувеличивать.
Часто ты используешь ссылки на указатели ?
Да ещё чтобы писать в них можно было ...

Вообще, это код из С, там ссылок нет.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823658
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Но тут возможна та же самая проблема, если str1 является ссылкой на str2, потому что данный код эквивалентен такому:
Код: plaintext
1.
2.
int& i = j;
str1[i++] = str2[j++];


Это баг, что нет проверки на равенство, но из-за UB его можете не сразу заметить.

Да, и где тут UB ? Его тут нет.
...
Рейтинг: 0 / 0
Порядок вычисления
    #38823677
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа, и где тут UB ? Его тут нет.
Учите матчасть :)
MasterZivНе надо преувеличивать.
Часто ты используешь ссылки на указатели ?
Не вижу смысла спорить.
Сейчас в коде нет ссылок, а потом пришел другой программист и добавил ссылки. И приплыли.
Баги будут всегда. Вне зависимости от вашего желания и доброй воли.
...
Рейтинг: 0 / 0
25 сообщений из 110, страница 2 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Порядок вычисления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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