Как эта функция С++ может что-то вернуть?

avatar
Mumin
8 апреля 2018 в 12:01
235
2
0

Следующая функция не имеет «оценки возврата», она возвращает только 0, но работает и возвращает оценку отлично. Как такое может быть?

int Grade(double points)
{
    int grade = floor(0.25*points - 1.5);
    if (grade < 0)
        return 0;
}
Источник
273K
8 апреля 2018 в 12:03
3

prog.cpp: 3: 5: ошибка: «класс» не был объявлен в этой области

bolov
8 апреля 2018 в 12:04
5

грубое поведение

StoryTeller - Unslander Monica
8 апреля 2018 в 12:10
5

@bolov - лучшая опечатка :)

Galik
8 апреля 2018 в 12:22
2

То, что он компилируется, не означает, что он работает. Мой компилятор говорит: «предупреждение: управление достигает конца непустой функции». Я рекомендую вам включить уровень предупреждения компилятора.

Thomas Matthews
8 апреля 2018 в 17:09
0

У вас должен быть оператор return grade; после оператора if.

Thomas Matthews
8 апреля 2018 в 17:10
0

Кстати, у вас злой стиль кодирования. Имена переменных и функций должны отличаться более чем регистром. Это помогает устранять опечатки.

Ответы (2)

avatar
Ferruccio
8 апреля 2018 в 12:25
2

Наличие пути кода, который не возвращает значение, здесь явно является неопределенным поведением, поэтому возникает вопрос, как неопределенное поведение может вернуть здесь правильное значение? Предположительно, в конце функции должно быть return grade;.

Одним из возможных способов является то, как значения возвращаются функцией. В системах x86 возвращаемое значение int обычно помещается в регистр EAX перед возвратом функции. Другие архитектуры могут использовать другие имена регистров, но помещение возвращаемого значения в регистр довольно распространено.

Скорее всего, строка, вычисляющая значение grade, в первую очередь оставила значение grade в регистре EAX. Или, возможно, строка, которая сравнивает grade с 0, загружает его в регистр EAX. В любом случае, когда функция вернется, она будет иметь правильное значение в EAX. Если вы действительно хотите знать, что он делает, попросите компилятор сгенерировать листинг ассемблера или пройдитесь по коду с помощью отладчика на уровне языка ассемблера.

Неопределенное поведение означает, что технически код может делать что угодно. А это значит, что иногда он поступает (очевидно) правильно.

avatar
eerorika
8 апреля 2018 в 12:06
5

Как такое может быть?

Либо функция возвращает 0, когда grade меньше нуля (после модификации), либо поведение программы неопределенно, когда grade не меньше нуля. Если функция возвращает непустое значение, то она не должна заканчиваться без возвращаемого выражения, иначе будет UB.