powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что неопределённого в `c = -(c++);`?
25 сообщений из 50, страница 2 из 2
Что неопределённого в `c = -(c++);`?
    #39779731
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинэто-то так, но формально: как писать нельзя определяет компилятор, если дает ошибку - нельзя, не дает - можно.
Вообще-то нет.
Стандарт позволяет компилятору игнорировать возможность написания кода идиотами, чтобы дать возможность оптимизировать код нормальных программистов.
Это называется undefined behavior и unspecified behavior (UB).
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779840
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devmayton, вообще не понимаю - зачем эти извращения?
Почему просто не написать?:
Код: plaintext
1.
c++; c *= -1;


очевидно это бывшие однострочники perl
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779843
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiva.guestПочему-то в одной недавней теме многие писали, что это UB, хотя C++17 постановил, что
пропущено...


Код: plaintext
1.
c = -(c++);




Тут проблема-то не в том, что раньше чего вычисляется, а то,
что тут есть два побочных эффекта, которые случаются до ;
Порядок их обработки не определён.
а что вообще компилятор должен подумать, когда видит c = -c;
?
должно быть c *= -1, например

и потом, после c++ может случиться выход из диапазона (превышен INT MAX)
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779852
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)но вот если его перевести то ох и ах, оно даёт только определение "упорядоченного выражения"Какое ещё "упорядоченное выражение"? Гугл-транслейтом переводили?
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779859
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинmaytonСовершенно верно. Правильный ответ - так писать нельзя и данный код не должен проходить code-review.
Обсуждать нечего. Впрочем ... иногда подобные вопросы задают по приколу чтоб "осадить не в меру
зазанвшегося юнца".

это-то так, но формально: как писать нельзя определяет компилятор, если дает ошибку - нельзя, не дает - можно.
В данном случае - ошибки нет.
Дело в том что С++ оставил за собой свойства портабельного ассемблера. Грубо говоря он очень многое
позволяет написать. И ответственность за результат берет на себя разработчик. Он этим как-бы говорит
- я ЗНАЮ что я делаю. И заткнитесь все.

Но при этом мы все понимаем что такой либерализм имеет последствия. И junior на собеседовании
может выбрать 2 линии поведения. Первое - он просто скажет что стандарт определяет это как UB.
И так писать не рекомендуется. Или он может "упереться рогом" и вступить в безнадёжный спор
о том что в его компилляторе ДОМА всё нормально работает. Или еще бох знает какой вариант...

И именно поэтому в данном форуме я считаю споры об UB бесполезной тратой времени и вашего
сетевого трафика.
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779882
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня кстати без ошибок работает
Код: plaintext
1.
2.
    int c = 5;
    c = -(c++);


-5

gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)

и "c = -c" тоже
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779883
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя нет, он делает 5+1, а потом -1
хотя ожидалось -6
чем не UB
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779885
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудуххотя ожидалось -6

Кем ожидалось? Результат операции (5++) это 5, без вариантов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779887
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
полудуххотя ожидалось -6С чего это?
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779890
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
int c = 5;
c = c++;
5
c = c+1;
6


наверное я гуманитарий
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779899
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКем ожидалось? Результат операции (5++) это 5, без вариантов.
Код: plaintext
1.
2.
3.
int v = 5;
v++; // 6
v = v++; // 5


v++ ведь становится 6
почему он справа от = не становится 6 ?
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779909
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
полудухDimitry SibiryakovКем ожидалось? Результат операции (5++) это 5, без вариантов.
Код: plaintext
1.
2.
3.
int v = 5;
v++; // 6
v = v++; // 5


v++ ведь становится 6
почему он справа от = не становится 6 ?Становится.
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779916
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухDimitry SibiryakovКем ожидалось? Результат операции (5++) это 5, без вариантов.
Код: plaintext
1.
2.
3.
 int v = 5;
 v++; // 6
 v = v++; // 5


v++ ведь становится 6
почему он справа от = не становится 6 ?
Маленькая ремарка. В МОМЕНТ использования v в expression он ЕЩЕ равен 5. И после выхода из expression
делается пост-инкремент. Потому он и называется пост.
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779920
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМаленькая ремарка. В МОМЕНТ использования v в expression он ЕЩЕ равен 5. И после выхода из expression
делается пост-инкремент. Потому он и называется пост.
лучшее определение для выражения UNDEFINED BEHAVIOUR
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39779993
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухv++ ведь становится 6

Нет. Научись отличать результат операции от её побочного эффекта.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39780000
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovполудухv++ ведь становится 6

Нет. Научись отличать результат операции от её побочного эффекта.
шта?
потрудитесь выражаться конкретнее
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39780011
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухmaytonМаленькая ремарка. В МОМЕНТ использования v в expression он ЕЩЕ равен 5. И после выхода из expression
делается пост-инкремент. Потому он и называется пост.
лучшее определение для выражения UNDEFINED BEHAVIOUR
Это не UB. Это нормальное поведение кода. UB начинается когда вы миксуете несколько выражений справа от знака равно
и когда переменная появляется слева от знака равно.
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39780014
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухшта?
Какое слово тебе непонятно?

Результатом постфиксного инкремента является изначальное значение переменной. Точка. Это
явно написано в стандарте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39780029
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
непонятно откуда взялся "побочный эффект", если
maytonЭто нормальное поведение кода.
+1 чтоли там "побочный эффект"?
Dimitry SibiryakovРезультатом постфиксного инкремента является изначальное значение переменной. Точка. Это явно написано в стандарте.
т.е. переменная вообще не изменяется.
учитывая, что само слово "инкремент" означает +1, что-то тут не сходится...
правильнее звучит, что инкремент состоит из двух составляющих: "+1" и "использование в выражении".
но ни один из них не является "побочным"
авторГлавное различие между ними, что при использовании операции преинкремента значение переменной сначала увеличивается на 1, а затем используется в выражении, к которому относится данная переменная. А при использовании операции постинкремента значение переменной сначала используется в выражении, а потом увеличивается на 1.
уж простите моё занудство, но раз уж мы тут до запятых решили разобраться
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39780036
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух+1 чтоли там "побочный эффект"?

Да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39780071
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)a.guestпропущено...
Какое ещё "упорядоченное выражение"? Гугл-транслейтом переводили?блесни познаниями как ещё транслейтнуть
is said to be Т.е. ты переводишь An expression X is said to be sequenced before an expression Y… как Выражение X называют упорядоченным ?
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39780075
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О чем вы спорите? Вернитесь в русло топика.
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39780089
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a.guest,

авторпару X,Y называют упорядоченной если каждое вычисление значения и каждый побочный эффект, связанный с выражением X, упорядочивается перед каждым вычислением значения и каждым побочным эффектом, связанным с выражением Y. если смысл переводить с учётом предложений до этого

авторGiven any two evaluations A and B, if A is sequenced before B (or, equivalently, B is sequenced after A), then the execution of A shall precede the execution of B. Evaluations A and B are indeterminately sequenced when either A is sequenced before B or B is sequenced before A, but it is unspecified which.
и гугл вполне осиливает, я всё равно термин на русский не подберу (может "выстраивается", если уж речь о компиляторе)
гуглПри любых двух оценках A и B, если A упорядочен до B (или, что то же самое, B упорядочен после A), тогда выполнение A должно предшествовать выполнению B. Оценки A и B являются неопределенно упорядоченными , когда либо A упорядочивается перед B, либо B упорядочивается перед A, но не указано, какие именно.

т.е. по факту весь этот блок это масло-масленное
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39780093
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan), и в чём проблема с `i = i++`, раз ты оказывается более-менее осилил перевод?
...
Рейтинг: 0 / 0
Что неопределённого в `c = -(c++);`?
    #39780094
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Достаточно поговорили. Закрыто
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что неопределённого в `c = -(c++);`?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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