Попалось сабжевое выражение, оказалось что под разными компиляторами разное поведение. UB это или нет? По логике *p++ вначале разименовывает указатель, то есть получает значение, затем инкриментирует его (то есть значение.), так как постфиксный инкремент имеет самый низкий приоритет. Доходят слухи что это не так, и инкриментируется указатель, а не значение, но только после того как значение вычислено, тогда тут получается UB ибо не понятно какой указатель будет при присваивании левой части. И a = 0; b = 0; (a++) == ++b ?
Хм значит постфиксные операции ++ и -- выполняются до унарных операций (в частности *), и в итоге имеем *p++ эквивалентно *(p++). А выражения типа a = a[i++], *p = *p++ , a = i++ получаются UB. Интересно оказывается и постфиксные и префиксные операции имеют одинаковый приоритет, постфиксный инкримент также сразу увеличивает переменную, но только возвращает на единицу меньше. По ходу i = i++; можно интерпретировать как: 1) i = i +1 - вычисление правой части. ( i++ ) 2) i = i - 1 - собственно само присваивание. ( i = 1)) Вообщем если в выражение дважды используется переменная (пофигу где слева или справа), и есть ++ или --, то получаем UB.
Мне кажется он под "возвращает" имел ввиду не 'return' Кстати, как в данном случае обстоят дела с запятой? return i++, i; или for (i = 1, i++; bla-bla)
Какие-то странные вопросы здесь мусолятся. Какие еще "слухи"?? Читайте стандарт в первоисточнике. nester7 Кстати, как в данном случае обстоят дела с запятой? return i++, i; или for (i = 1, i++; bla-bla) Ну если вы такой ленивый, что заглянуть в стандарт лень, скомпилируйте хотя бы это: Код (Text): int i = 1; printf("i: %08x\n", (i++, i));
Именно поэтому и спросил, потому что такими конструкциями не пользуюсь, а искать сверхзаломало, хоть и проверил компилятором что всё ок, просто остались сомнения. Не бузи
Я ни об чём, просто закрыл, так сказать, тему. Копипастнул кусочек стандарта, чтобы другим не лазить по этой теме, если кто вдруг будет искать и нарвется на этот топик.