На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Вопрос о assert
    Доброе время суток.
    Подскажите, плиз, с чем может быть связано такое поведение:
    ExpandedWrap disabled
      assert(*pt == 7 && *(++pt) == 11); // - норма
       
      int tmp = *(++pt);
      assert(*pt == 7 && tmp == 11); // - вылет по исключению
      В первом случае инкремент происходит после *pt == 7, а во втором - до.
      Сообщение отредактировано: shm -
        Операция && вносит точку следования и не вычисляет правый операнд, если левый false. Если *pt != 7, то pt не меняется. Далее вычисляется инициализирующее значение tmp, и pt безусловно инкрементируется, и при последующем вычислении *pt == 7 значение указателя уже другое.
          Qraizer, я думаю, что тут дело не в точках следования, а именно в результате самих assert, т. к. если *pt == 7 будет false, то на нем и вылетит. :)
            Точка следования тут к тому, что pt меняется внутри выражения, что обычно ведёт к UB, если меняющийся операнд используется в выражении более одного раза (и если это не присваивание, когда разрешено его менять посредством этого самого присваивания), но с операциями &&, ||, :? и , это не так.
            Вообще же модификация операнда в assert-выражении – это те ещё грабли.
              Ну я надеюсь ТС pt больше не использует, т. к. очевидно различное поведение в дебаге и релизе.
                Спасибо за разъяснения :thanks:
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0303 ]   [ 17 queries used ]   [ Generated: 19.04.24, 04:00 GMT ]