UB ли *p = *p++; или как это есть?

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

  1. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Попалось сабжевое выражение, оказалось что под разными компиляторами разное поведение. UB это или нет? По логике *p++ вначале разименовывает указатель, то есть получает значение, затем инкриментирует его (то есть значение.), так как постфиксный инкремент имеет самый низкий приоритет. Доходят слухи что это не так, и инкриментируется указатель, а не значение, но только после того как значение вычислено, тогда тут получается UB ибо не понятно какой указатель будет при присваивании левой части.
    И a = 0; b = 0; (a++) == ++b ?
     
  2. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Это вроде a = a[i++];

    http://c-faq.com/ptrs/unopprec2.html

    [+]
    http://c-faq.com/expr/index.html
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Хм значит постфиксные операции ++ и -- выполняются до унарных операций (в частности *), и в итоге имеем *p++ эквивалентно *(p++). А выражения типа a = a[i++], *p = *p++ , a = i++ получаются UB.
    Интересно оказывается и постфиксные и префиксные операции имеют одинаковый приоритет, постфиксный инкримент также сразу увеличивает переменную, но только возвращает на единицу меньше.
    По ходу i = i++; можно интерпретировать как:
    1) i = i +1 - вычисление правой части. ( i++ )
    2) i = i - 1 - собственно само присваивание. ( i = 1))
    Вообщем если в выражение дважды используется переменная (пофигу где слева или справа), и есть ++ или --, то получаем UB.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Обычно он реализуется как "auto tmp = i; ++i; return tmp;"
     
  5. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Мне кажется он под "возвращает" имел ввиду не 'return' :)

    Кстати, как в данном случае обстоят дела с запятой?
    return i++, i;
    или
    for (i = 1, i++; bla-bla)
     
  6. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Какие-то странные вопросы здесь мусолятся. Какие еще "слухи"?? Читайте стандарт в первоисточнике.

    nester7
    Кстати, как в данном случае обстоят дела с запятой?
    return i++, i;
    или
    for (i = 1, i++; bla-bla)

    Ну если вы такой ленивый, что заглянуть в стандарт лень, скомпилируйте хотя бы это:
    Код (Text):
    1. int i = 1;
    2. printf("i: %08x\n", (i++, i));
     
  7. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Именно поэтому и спросил, потому что такими конструкциями не пользуюсь,
    а искать сверхзаломало, хоть и проверил компилятором что всё ок, просто
    остались сомнения. Не бузи :)
     
  8. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    nester7
    Не обижайтесь, я люблю поговнючить и повыпендриваться, когда знаю ;)
     
  9. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Это нормально, плохо, когда любят и ничерта не знают :)
    Я и не обижался, ибо не на что.
     
  10. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    mathio
    В стандарт заглянуть всё-таки пришлось, а за одно и посмотрел про запятую :)

     
  11. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Ну дык, всё правильно ;)
    Или вы аб чом?)
     
  12. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Я ни об чём, просто закрыл, так сказать, тему.
    Копипастнул кусочек стандарта, чтобы другим не лазить по этой теме,
    если кто вдруг будет искать и нарвется на этот топик.