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