|
2 / 2 / 0
Регистрация: 12.12.2014
Сообщений: 87
|
||||||
Задача на рекурсию - почему вроде бы ошибочный код внутри работает правильно?31.12.2016, 00:08. Показов 1479. Ответов 13
Метки нет (Все метки)
Изучаю учебник C++, решаю задачки в конце глав.
В одной задачке надо было написать рекурсивную функцию, получающую в качестве аргумента массив и его размер, и возвращающая его минимальное значение. Я с наскоку написал вот такой код:
В функции recursiveMin есть два оператора if, и оператор return выполняется только тогда, когда хотя бы одно из проверяемых условий верно. Однако самый первый вызов функции recursiveMin (непосредственно из main) приводит к тому, что оба условия в if ложны, и return, который должен вернуть в main значение, в нём просто отсутствует. Получается, что если вызов функции на верхнем уровне рекурсии не доходит до return, то в main возвращается значение из вызова на какой-то глубине рекурсии (очевидно, самый последний return, который был встречен). Такое поведение, как мне кажется, неожиданно и нелогично. Почему так происходит? И как средствами компилятора (Visual Studio 2015) посмотреть что куда возвращается?
1
|
||||||
| 31.12.2016, 00:08 | |
|
Ответы с готовыми решениями:
13
Почему не работает код, хотя вроде всё правильно
Проверьте код, почему то не работает, вроде правильный |
|
|
||||||
| 31.12.2016, 06:40 | ||||||
Сообщение было отмечено Thor как решение
Решение
http://stackoverflow.com/quest... rn-a-value
UB, походу. Когда return недостижим то просто возвращается содержимое регистра EAX (?). А хранится там последнее возвращённое значение функции recursiveMin что равно последнему найденному минимуму. Регистры можно посмотреть в VS2015 так: ставишь брейкпоинт и когда он сработает открываешь Debug->Windows->Registers. С такой ф-цией результат будет неправильный
2
|
||||||
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,220
|
|
| 31.12.2016, 10:02 | |
|
2
|
|
|
Супер-модератор
|
|||||||||||
| 31.12.2016, 19:12 | |||||||||||
|
Что же... Сомнения вполне обоснованны. Тем более, что код работает неверно.
Вот такой вызов выдает min=5 (а должен -2).
1
|
|||||||||||
|
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
|
||||||
| 31.12.2016, 21:24 | ||||||
|
Thor, держите код. Надеюсь, это то, что нужно:
1
|
||||||
|
2 / 2 / 0
Регистрация: 12.12.2014
Сообщений: 87
|
|
| 31.12.2016, 21:58 [ТС] | |
|
igorrr37, спасибо за инфу!
TheCalligrapher, почитал тред, помог немного разобраться. Catstail, у меня ваш код (первый который) даёт правильный ответ (-2), т.е. работает верно (компилятор VS2015). Fixer_84, спасибо. Вообще, свой код-то я исправил. У меня был чисто методологический вопрос по тому как работает C++ в условиях, когда возвращающая значение функция не достигает return.
0
|
|
|
Супер-модератор
|
|||||||||||||||||||||
| 01.01.2017, 18:41 | |||||||||||||||||||||
|
Thor, это не мой, а ваш код. Вот как он работает с отладочной печатью:
А вот - правильный код тоже с отладочной печатью:
0
|
|||||||||||||||||||||
|
2 / 2 / 0
Регистрация: 12.12.2014
Сообщений: 87
|
||||||
| 01.01.2017, 21:33 [ТС] | ||||||
|
Catstail, если в первом коде из вашего сообщения закомментить строку 18, то код у меня (на моём компе, с использованием моего компилятора) работает "правильно":
В данной маленькой программе всё просто, легко увидеть ошибку и исправить её. Но в более сложных программах, если логические операторы написаны с ошибкой и функция не достигает return'а, то ни во время компиляции, ни во время выполнения не возникает ошибок, код работает, и функция что-то возвращает. Я создал эту тему, потому что такое поведение С++ меня озадачило, и хотел в этом разобраться.
0
|
||||||
| 01.01.2017, 21:44 | |
|
А варнинг-чекер в ИДЕ молчит по этому поводу? Меня вот в ИДЕЕ заколебало, что даже в целях отладки я не могу вначале длинной функции вставить ретурн тру потому что дескать все что после становится недостижимо и кот даже не компилируется. В плюсовых ИДЕ типа Студии нет такого уродства? Или его надо искать в продуктах от Джет Брайнс типа Клиона? Или вы пишете кот в блокноте?
В любом случае, вам может помочь либо жесткий стайлгайд, либо статический котоанализатор, либо другой язык
0
|
|
|
Любитель чаепитий
|
||
| 01.01.2017, 22:03 | ||
|
А вообще, в том же gcc такой проблемы не имеется. Вот в приведенном ниже примере компилятор поначалу выдаёт варнинг на неиспользуемую переменную, но флагом -Wno-unused-variable мы его выключаем. ![]() http://rextester.com/VJKF88743
0
|
||
| 01.01.2017, 22:09 | ||
![]() ЗЫ а в джаве по-моему все-таки ИДЕЯ палки в колеса вставляет, а не компилятор. Хотя не исключаю возможности, что где-то среди ее 100500 настроек есть незаметный флажок "не вставлять палки в колеса", но по дефолту он отключен.
0
|
||
|
Любитель чаепитий
|
||
| 01.01.2017, 22:21 | ||
|
0
|
||
|
Супер-модератор
|
||||||||||||||||
| 02.01.2017, 10:00 | ||||||||||||||||
|
Thor, да, проверил работу в VC6.0. Действительно если закомментировать отладочную печать, то выдает верный минимум. Надо читать, как реализован выход из функции, которая должна возвращать некий тип, а оператор return отсутствует...
Проделал небольшой эксперимент с VC6.0. Пишем вот такой код:
1
|
||||||||||||||||
|
Супер-модератор
|
||||||
| 02.01.2017, 10:32 | ||||||
|
Кстати, теперь понятно, почему, закомментировав
1
|
||||||
| 02.01.2017, 10:32 | |
|
Помогаю со студенческими работами здесь
14
Одномерные массивы. Все работает, вроде правильно. Как лучше организовать код!? Написал код на VBA вроде работает но не знаю правильно или нет показывает)по заданию Не работает код js, почему ? Код внутри
Почему правильно работает код? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|