Форум программистов, компьютерный форум CyberForum.ru

Значение якобы возвращённое функцией при опущенном return - C++

Восстановить пароль Регистрация
 
SaShka K
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 55
27.03.2014, 16:20     Значение якобы возвращённое функцией при опущенном return #1
Что считается значением, возвращённым функцией, в которой опущен оператор `return`?
Зачем компилятор позволяет не указывать `return` в не-void функциях?

Допустим, есть такой метод класса:
C++
1
2
3
4
5
6
7
8
9
10
11
...
int Arr::getElement(unsigned i){
   if (i >= _noe) {  //_noe - кол-во элементов массива
      printf("\t ERROR: Trying to access NONexistent element (current noe=%u). \n", _noe);
      //тут мог бы быть `return`, но вернуть мне нечего (были бы элементы массива ..
      //.. беззнаковыми, вернул бы "-1"). Т.к. не знаю, что вернуть, вообще не указал `return`.
   }
   else
      return _data[i];
}
...
Если в массиве `arr1` например всего 10 элементов, то вот эта строка в `main()` выводит значение "65". Откуда берётся это значение?
C++
1
std::cout << arr1.getElement(100);
Напомню, второй вопрос, почему такое оформление кода (без `return` в не-void функциях) допускает компилятор?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2014, 16:20     Значение якобы возвращённое функцией при опущенном return
Посмотрите здесь:

C++ В чем разница между return и return false/true
Как сделать так, что если файл существует return true, если нет - return false C++
C++ Переменные при использовании шаблонов. Оператор return
C++ Значение пустого оператора return
Значение оператора return C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.03.2014, 16:54     Значение якобы возвращённое функцией при опущенном return #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от SaShka K Посмотреть сообщение
почему такое оформление кода (без `return` в не-void функциях) допускает компилятор?
Потому что это допускается стандартом. А стандартом это допускается в частности по причине того, что анализ на наличие возвращаемого значения может быть очень сложен для компилятора, например потому что возвращаемое значение можно установить используя ассемблерный код.
http://stackoverflow.com/questions/1...lue-without-pr
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
27.03.2014, 16:55     Значение якобы возвращённое функцией при опущенном return #3
Опытным путем выяснилось, что возвращает оно последнее возвращенное значение, которое оказалось возвращенным числом int, которое возвращает функция printf. А значит оно количество символом в строке.
Цитата Сообщение от SaShka K Посмотреть сообщение
\t ERROR: Trying to access NONexistent element (current noe=%u). \n
В данном случае 65.
SaShka K
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 55
27.03.2014, 20:42  [ТС]     Значение якобы возвращённое функцией при опущенном return #4
В общем, это UB. Так в стандарте:
From n2960 draft:
§ 6.6.3/2
Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.
Спасибо за Ваши ответы. Возможно сможете подсказать мне, как, не прерывая выполнение программы, красиво обработать (в т.ч. без этой проблемы с отсутствием `return`) описанную в постановке вопроса попытку обращения к несуществующему элементу массива. На ум приходят только исключения, но это, видимо, не вполне подходящий инструмент для данной ситуации (громоздкий код получиться, которого, кажется, проблема не стоит). Заранее благодарен.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.03.2014, 23:15     Значение якобы возвращённое функцией при опущенном return #5
SaShka K, исключения - вполне стандартный подход. См. std::vector<T>::at()
Yandex
Объявления
27.03.2014, 23:15     Значение якобы возвращённое функцией при опущенном return
Ответ Создать тему
Опции темы

Текущее время: 17:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru