Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
SaShka K
3 / 3 / 3
Регистрация: 16.01.2014
Сообщений: 55
#1

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

27.03.2014, 16:20. Просмотров 256. Ответов 4
Метки нет (Все метки)

Что считается значением, возвращённым функцией, в которой опущен оператор `return`?
Зачем компилятор позволяет не указывать `return` в не-void функциях?
http://www.cyberforum.ru/cpp-beginners/thread855949.html

Допустим, есть такой метод класса:
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 функциях) допускает компилятор?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2014, 16:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Значение якобы возвращённое функцией при опущенном return (C++):

Значение пустого оператора return
Скажите для чего он нужен вообще? допустим: void Func(){ if(){ ...

Значение, возвращаемое return, не соответствует ожиданиям
Добрый вечер! Подскажите, пожалуйста, что я делаю не так? Почему return...

В чем разница между return и return false/true
Привет всем. Вот подскажите плиз) return; return false; return true; ...

Как вернуть только верхнее значение стека через return
Есть рекурсивная функция, которая возвращает определенное значение. Вопрос -...

Значение, возвращаемое функцией (C++)
В общем, задача такая. Написать программу, печатающую все вводимые символы в...

4
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
27.03.2014, 16:54 #2
Лучший ответ Сообщение было отмечено SaShka K как решение

Решение

Цитата Сообщение от SaShka K Посмотреть сообщение
почему такое оформление кода (без `return` в не-void функциях) допускает компилятор?
Потому что это допускается стандартом. А стандартом это допускается в частности по причине того, что анализ на наличие возвращаемого значения может быть очень сложен для компилятора, например потому что возвращаемое значение можно установить используя ассемблерный код.
http://stackoverflow.com/questions/1...lue-without-pr
1
Wlk
90 / 90 / 48
Регистрация: 07.12.2011
Сообщений: 214
Завершенные тесты: 4
27.03.2014, 16:55 #3
Опытным путем выяснилось, что возвращает оно последнее возвращенное значение, которое оказалось возвращенным числом int, которое возвращает функция printf. А значит оно количество символом в строке.
Цитата Сообщение от SaShka K Посмотреть сообщение
\t ERROR: Trying to access NONexistent element (current noe=%u). \n
В данном случае 65.
1
SaShka K
3 / 3 / 3
Регистрация: 16.01.2014
Сообщений: 55
27.03.2014, 20:42  [ТС] #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`) описанную в постановке вопроса попытку обращения к несуществующему элементу массива. На ум приходят только исключения, но это, видимо, не вполне подходящий инструмент для данной ситуации (громоздкий код получиться, которого, кажется, проблема не стоит). Заранее благодарен.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
27.03.2014, 23:15 #5
SaShka K, исключения - вполне стандартный подход. См. std::vector<T>::at()
1
27.03.2014, 23:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2014, 23:15
Привет! Вот еще темы с решениями:

Как сделать так, что если файл существует return true, если нет - return false
Здравствуйте, я новичок в программировании. Мой вопрос очень прост: как...

Срабатывание деструктора при return класса
Есть класс: class Test { public: char* Data; }; У этого класса есть...

Посчитать значение выражения с функцией
Для данных действительных чисел x и y посчитать значение выражения \frac{0.5...

Переменные при использовании шаблонов. Оператор return
Доброго времени суток. В домашнем задании на первом семестре обучения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru