Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C/C++. Точки следования. Неопределённое поведение

Παν μέτρον άριστον Мыслитель (9576), закрыт 4 года назад
Кто-нибудь может объяснить, почему такая конструкция даёт двойной инкремент?
if (tolower(*string++) != 'e')
Дополнен 4 года назад
Вот, где я это заметил:
https://ideone.com/SE9v0O - инкремент в блоке
https://ideone.com/OfABY3 - инкремент в условии
(смотрите вывод, всё станет понятно)
Лучший ответ
Aljebro Просветленный (27088) 4 года назад
Где пруф двойного инкремента?
Минимальный код: инициализация, вывод адреса до, вывод адреса после.
Παν μέτρον άριστονМыслитель (9576) 4 года назад
добавил
Aljebro Просветленный (27088) В первом случае ++string выполняется при условии во втором всегда.
Остальные ответы
Я Красавчег Мыслитель (8334) 4 года назад
Все просто. А дебагер зачем тогда!? Короче в конструкции if(test++) создается копия текущего test и с ним производится сравнение, а увеличивается оригинал. Для простоты понимания можно думать что сначала производится сравнение, а потом только инкремент. То есть даже если буква была найдена сейчас, то инкремент все равно произойдет. Таким не страдает if(++test) потому что вначале будет произведен инкремент, а потом только проверка. Но в данном примере такое не работает. Потому-что if(!isalpha(*string)) пропустит пробел так как это не символ и тогда сравнение будет производится уже со второй буквой, а первая будет пропущена.
Παν μέτρον άριστονМыслитель (9576) 4 года назад
да все уже, понял я где затупил
Я Красавчег Мыслитель (8334) А дебагером пользуешься или не знаешь что такое!? Могу видосик подсуетить...
Παν μέτρον άριστονМыслитель (9576) 4 года назад
там дело не в этом, а банально в том, что инкремент будет произведен в любом случае, либо произведен по условию, просто я думал про while(*string++) {}, потом мысленно переключился на if и ступил. Почему-то меня понесло в сторону точек следования.
Я Красавчег Мыслитель (8334) То есть как это в любом случае?
Похожие вопросы