LINUX.ORG.RU

Вопрос по С


0

0

Имеется инструкция
a = (a++)%m
Пусть a < m
Во-первых почему gcc пишет warning: operation on `a' may be undefined

И во-вторых, может ли такая конструкция быть истолкована двусмысленно?

Дело в том, что сегодня на паре у меня вышел небольшой спор с преподавателем, он утверждал, что a будет увеличиваться, я утверждал, что a не изменится. В конце концов я ему "поверил", но оказывается я был прав. По крайней мере gcc доказывает мою правоту.

anonymous

ты инициализировал a до этой операции-то?

anonymous
()

дело в том, что инкремент может произойти ДО присваивания, а может и ПОСЛЕ. Стандарты этого не фиксируют. А компилятор может сделать как угодно.

k_andy ★★★
()

> Может a = ++a%m ?

Нет.

> ты инициализировал a до этой операции-то?

Да

> дело в том, что инкремент может произойти ДО присваивания, а может и ПОСЛЕ. Стандарты этого не фиксируют. А компилятор может сделать как угодно.

Кажется понял. Если честно, не совсем понятно, почему, мне кажется логичнее это зафиксировать в стандарте. Ну да ладно, не мне судить. Тогда в принципе понятно, но код становится попросту бессмысленным, так что в любом случае нельзя сказать, что я был полностью неправ, т.к. деления по модулю не будет.

Спасибо.

anonymous
()

Преподов таких гнать ссаными тряпками в биореактор ;-)

anonymous
()

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

fghj ★★★★★
()
Ответ на: комментарий от anonymous

> Если честно, не совсем понятно, почему, мне кажется логичнее это зафиксировать в стандарте.

'undefined behaviour' дает большую свободу оптимизатору

int19h ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.