int i=0; i = i++ + ++i - i++; чему равно i?

Тема в разделе "LANGS.C", создана пользователем na1s, 24 окт 2007.

  1. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    CoolCmd
    Даже не знал что такой бред возможен. Но только какой в этом смысл?
    Как я понимаю присваиваем x единицу, а потом этому выражению что-то другое.
    Imho это что-то вроде:
    Бред и только.
     
  2. CoolCmd

    CoolCmd New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    21
    Адрес:
    Moscow
    Booster
    Не спорю, это бред. За такой код (и за тот что в заголовке написан) нужно яйца отрывать.
    Но вопрос был другой. :) Хочется понять, правильно ли я понял цитату из стандарта. Т.е. первое выражение вроде дает UB, а второе - нед?
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    CoolCmd
    IMHO интерпретация обоих выражений очевидна ( и + x, - 2 просто отбрасываются компиллером за ненадобностью), а потому это не должно быть UB. Хотя это наверно просто частный случай таких г:
    Что уже наверняка UB. Так как х фигуриует и в левых и правых частях, с изменением по-месту. То есть x меняется и слева и с права.
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    CoolCmd
    IMHO, если написать так:
    Код (Text):
    1. y = (x = 1) + x;
    2. y = (x = 1) - 2;
    то первое - UB (не определено, какой операнд сложения вычисляется первым), второе - нет - y по-любому равен -1. Значит, за вторую конструкцию яйца отрывать не надо, а за первую - вполне богоугодное дело :) Любопытно другое - стандарт считает UB некоторые конструкции, которые по логике вроде бы однозначны - выдирка из стандарта (правда он у меня довольно старый, надо посмотреть обновления:
    Код (Text):
    1. i = v[i ++]; // the behavior is undefined
    2. i = 7 , i++ , i ++; // i becomes 9
    3. i = ++ i + 1; // the behavior is undefined
    4. i = i + 1; // the value of i is incremented
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ustus
    И чего же тут не так? 1 и 3 UB и в африке UB.
     
  6. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Booster
    Да вроде как 3 по логике прозрачно... тогда и i = ++i - это тоже UB? Конечно, возможно это оправдано для применения каких-то дико оптимизирующих компиляторов, причем не обязательно x86, но уж очень это жестоко...
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ustus
    Да это UB. И дело тут даже не в оптимизации, (хотя здесь она далеко не дикая, а даже простая, выполнение операции без повторной работы с результатом), а в том что тут нету единственно верной интерпретации. Ну кто скажет как она должна единственно правильно интерпертироваться? По-мойму ни кто. ++i определено, а i = ++i уже нет. Компилятор не обязан разбираться в подобном изврате, у него и так проблем хватает, уж извольте говорить на понятном ему языке. Да и ++i не для подобного задумывалась.
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Ustus
    Я думаю, это сделано для упрощения определения UB.
    Фактически все вышеперечисленные случаи UB сводятся к одному правилу: порядок вычисления аргументов ф-ции неопределён.
    Ведь i = ++i в функциональном виде будет:
    Assign(i, Increment(i))
     
  9. nerezus

    nerezus New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    89
    Код (Text):
    1. i = ++i - это тоже UB? ... уж очень это жестоко
    А разве нет? )
    Но в любом случае, человек в здравом уме так никогда не напишет, поэтому какая разница на практике? ;)
     
  10. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    nerezus
    Для меня - никакой :) я так не пишу.
    И вообще, что значит "какая разница"? Есть логика, а есть философия. Сабж относится ко второй. А философия это такая штука, что всегда неравнодушна к дурацким вопросам :):):)