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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
SaShka K
3 / 3 / 0
Регистрация: 16.01.2014
Сообщений: 55
#1

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

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

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

Значение оператора return - C++
Прочитал про оператор return, но не очень понятно про его. Как он используется ниже (объясните), может после этого примера что-либо...

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

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

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

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

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

4
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.03.2014, 16:54 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от SaShka K Посмотреть сообщение
почему такое оформление кода (без `return` в не-void функциях) допускает компилятор?
Потому что это допускается стандартом. А стандартом это допускается в частности по причине того, что анализ на наличие возвращаемого значения может быть очень сложен для компилятора, например потому что возвращаемое значение можно установить используя ассемблерный код.
http://stackoverflow.com/questions/1...lue-without-pr
1
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
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 / 0
Регистрация: 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
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Привет! Вот еще темы с ответами:

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

Переменные при использовании шаблонов. Оператор return - C++
Доброго времени суток. В домашнем задании на первом семестре обучения поставлена задача: написать перегруженные шаблоны функций для...

Якобы функция перегружена - C++
Всем привет. Мой компилятор говорит что то там что в этом коде функция round(a); перегружена. Но она там одна. Что за дела? Может дело в...

Как присвоить значение возвращаемое функцией? - C++
#include &lt;iostream.h&gt; char* abc(int num){ static char masiv; masiv = num+'0'; return masiv; } main(){ char...


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

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

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