С++ - значение возвращаемой функции

57
5

Я делал простую функцию 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? Я знаю, что должно быть другое выражение, но мне было любопытно, что произойдет без него

спросил(а) 2016-10-07T23:48:00+03:00 3 года, 11 месяцев назад
1
Решение
118

Вам просто нужно добавить инструкцию 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;
}
}

ответил(а) 2016-10-07T23:54:00+03:00 3 года, 11 месяцев назад
80

Вытекание конца функции приводит к неопределенному поведению в возвращающей значение функции. Поведение вашей программы не определено.

На практике это означает, что вызывающий абонент попытается прочитать возвращаемый int соответствии с тем, что используется для вызова, и не может этого сделать.

ответил(а) 2016-10-07T23:52:00+03:00 3 года, 11 месяцев назад
57

Чтобы понять, как и почему именно он ведет себя, вам нужно изучить используемое здесь соглашение о вызовах.

Я считаю, что типичный x86 C/C++ соглашение о вызовах является push (как в команде ASM) аргументы в стек, call функцию, а затем pop результат. В случае, если вы пропустите как if ветки и не требуете return, нет push инструкции генерируется. Но вызывающий по-прежнему будет pop. Что это будет? Все, что попадает в стек в этом месте, что может быть что угодно - нет способа узнать. И я думаю, что это приведет к повреждению стека при этом или, точнее, - поставьте его в состояние, которое другие пользователи стека не ожидают. Программа может перестать нормально работать, как я ее вижу, так как ваш стек уже запутан. Итог: не позволяйте функции non- void выходить без оператора return.

ответил(а) 2016-10-07T23:51:00+03:00 3 года, 11 месяцев назад
57

Вы не возвращаете ничего, когда x и y равны. Как следствие, программа имеет неопределенное поведение, когда x равно y.

Использование:

int min(int x, int y) {
if (x > y) {
return y;
}
else {
return x;
}
}

ответил(а) 2016-10-07T23:49:00+03:00 3 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема