С++ - значение возвращаемой функции
Я делал простую функцию min(), когда я вдруг задал себе вопрос, который немного усложнился, чем я, хотя
Я создал действительную функцию и получил идею опустить условие между двумя числами. Вот моя функция:
int min(int x, int y) {
if (x > y) {
return y;
}
else if (x < y) {
return x;
}
}
Таким образом, он отлично работает для разных чисел, если я ставлю 2 и 3 внутри, он вернется 2. Но что произойдет, когда я поставлю два раза столько же? например: 2 и 2
Ни 2> 2, ни 2 <2 действительны, поэтому он просто возвращается... ничего?
Что я, тем не менее, я скомпилировал программу (VS2015), получил предупреждение о том, что не тестировал каждый случай (нормальный), а когда он запускается... он выдает 2. Почему?
После разговора с людьми (и проверки кода ASM для этой функции) кто-то проверил Valgrind, что происходит, и, как он сказал мне, похоже, что это может быть утечка памяти. Я точно не знаю, как это работает, поэтому почему возвращение значения не приводит к возврату 2? Какой номер 2 возвращается?
Я также тестировал, если какое-то из этих условий было правдой по какой-то причине с простым std :: cout, но ни одна из них не является истиной, так что не что-то о "упрощении" с if (x > y) {...} else {...}
Так что же здесь происходит?
[EDIT] Я не хочу знать, как "исправить" его, потому что это довольно очевидно для меня. Вопрос в том, почему я получаю 2? Я знаю, что должно быть другое выражение, но мне было любопытно, что произойдет без него
Вам просто нужно добавить инструкцию else
потому что 2 = 2 не выполняет условие if(x > y)
, и не выполняет условие else if(x < y)
. Так что он ничего не может вернуть. Просто добавьте else
и верните одно и то же значение x.
int min(int x, int y)
{
if (x > y)
{
return y;
}
else
{
return x;
}
}
Вытекание конца функции приводит к неопределенному поведению в возвращающей значение функции. Поведение вашей программы не определено.
На практике это означает, что вызывающий абонент попытается прочитать возвращаемый int
соответствии с тем, что используется для вызова, и не может этого сделать.
Чтобы понять, как и почему именно он ведет себя, вам нужно изучить используемое здесь соглашение о вызовах.
Я считаю, что типичный x86 C/C++ соглашение о вызовах является push
(как в команде ASM) аргументы в стек, call
функцию, а затем pop
результат. В случае, если вы пропустите как if
ветки и не требуете return
, нет push
инструкции генерируется. Но вызывающий по-прежнему будет pop
. Что это будет? Все, что попадает в стек в этом месте, что может быть что угодно - нет способа узнать. И я думаю, что это приведет к повреждению стека при этом или, точнее, - поставьте его в состояние, которое другие пользователи стека не ожидают. Программа может перестать нормально работать, как я ее вижу, так как ваш стек уже запутан. Итог: не позволяйте функции non- void
выходить без оператора return
.
Вы не возвращаете ничего, когда x
и y
равны. Как следствие, программа имеет неопределенное поведение, когда x
равно y
.
Использование:
int min(int x, int y) {
if (x > y) {
return y;
}
else {
return x;
}
}
Еще в рубрике
- Вопросы
- Visual-studio-2015
- С++ - значение возвращаемой функции