![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
likehood |
|
|||
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Сегодня столкнулся со странным поведением компилтора (Visual C++ 7.1) на таком простом коде:
Вывод этой программы различный для Debug и Release версий: в отладочной версии результат вполне ожидаемый - 7, в то время как в релизе - 8. Я так и не нашел какие настройки компилятора влияют на этот результат, возможно это ошибка компилятора. Вот и интересно, может кто-то сталкивался с такой проблемой. К сожалению, у меня нет других компиляторов под рукой для проверки, особенно интересно было бы проверить в VS 2005. Какие будут идеи? |
|||
|
||||
nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Не делай так. Результат выражения, где переменная одновременно читается и изменяется несколько раз неопределён. см. Страуструпа -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Да. Чистый UB. Компилятор прав.
|
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Daevaorn, гхм...а где здесь UB? вызов ф-ции подразумевает её исполнение от начала и до конца... т. о. как не крути должно быть 7...
Добавлено через 4 минуты и 43 секунды и к слову, по стандарту нужно писать static int as = 1; и, что mingw-3.4.2, что vs-8.0sp1, что в debug, что в release выдаёт 7...скорее это баг старой студии (она далека от стандарта...) -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
likehood |
|
|||
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Что-то я в упор не вижу в каком выражении происходит то, что вы описали. Можно поподробнее? Добавлено через 1 минуту и 9 секунд Торопился просто, не заметил, а компилятор не подправил. Добавлено через 2 минуты и 10 секунд Думаю, далекость от стандарта здесь не причем. Здесь банальная логика нарушается. |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
просто при оптимизации компилятор разворачивает это в inline, а о том, что это вызов ф-ции забывает...получается
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
nickless |
|
||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Я думаю, что вот тут
Может это и баг студии, но ИМХО всё же лучше быть поосторожнее -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||
|
|||||
likehood |
|
|||
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Ну это уже проблемы компилятора как он заинлайнит фунцию. Замена простой функции на встроенную не должна менять логику работы программы. Все равно ошибка далеко не очевидна. В моем случае проблема возникла, когда в одном выражении нужно было использовать два разных случайных числа, получаемых вызовом функции random. Что ж, похоже это действительно ошибка студии. Всем спасибо за помощь. Вопрос решен. |
|||
|
||||
IvanoffAndrey |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 8.7.2006 Где: СГАУ Репутация: нет Всего: 2 |
Насколько мне память не изменяет return (++as)+1; не гарантирует что (++as)+1 - вычислится, по стандарту оператор return (). Т.е. здесь можно написать return( (++as)+1) - тогда вроде должно работать. Аналогичная ситуация с return(0)-ибо правильнее.
--------------------
Размерность пространства есть число Pi и в каждой точке вселенной оно стремиться к этому числу. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
threef |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
Daevaorn,
согласный.
кстати, у меня и в дебуге тоже 8 ( оптимизация, виш ли) |
||||
|
|||||
IvanoffAndrey |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 8.7.2006 Где: СГАУ Репутация: нет Всего: 2 |
Не буду тебя переубеждать, однако так всегда пишут, во всяком случае у меня в институте. --------------------
Размерность пространства есть число Pi и в каждой точке вселенной оно стремиться к этому числу. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |