C ++ возвращаемое значение без оператора возврата - PullRequest
12 голосов
/ 27 января 2011

Когда я запустил эту программу:

#include <iostream>

int sqr(int&);

int main()
{
    int a=5;
    std::cout<<"Square of (5) is: "<< sqr(a) <<std::endl;
    std::cout<<"After pass, (a) is: "<< a <<std::endl;
    return 0;
}

int sqr(int &x)
{
    x= x*x;
}

Я получил следующий вывод:

Square of (5) is: 2280716
After pass, (a) is: 25

Что такое 2280716?И как я могу получить значение, возвращаемое в sqr(a), пока в функции нет return оператора int sqr(int &x)?

Спасибо.

Ответы [ 6 ]

30 голосов
/ 27 января 2011

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

Добавьте оператор return и включите предупреждения в компиляторе (например, g++ -Wall).

int sqr(int &x)
{
    return x = x*x;
}
8 голосов
/ 27 января 2011

Это какой-то мусор, который будет зависеть от нескольких факторов.Вероятно, это значение, хранящееся в памяти, куда функция поместила бы результат, если бы она имела оператор return.Эта память остается нетронутой и затем читается вызывающей стороной.

Не думайте об этом слишком много - просто добавьте оператор return.

4 голосов
/ 27 января 2011

Ваша функция sqr() не имеет оператора возврата. Функция имеет неопределенное поведение относительно возвращаемого значения. Ваш первый вывод показывает это возвращаемое значение.

Хотя компилятор должен показывать диагностику.

попробуйте это:

int sqr(int x)
{
  return x*x;
}
3 голосов
/ 27 января 2011

Вы пытаетесь напечатать возвращаемое значение sqr (int & x), которое в данном случае является мусором.Но не возвращая правильного X * X.попробуйте вернуть действительный X * X из sqe

int sqr(int &x) { x= x*x; return x;}

2 голосов
/ 27 января 2011

Если функция не объявлена ​​void, то у вас ДОЛЖЕН есть оператор возврата, сообщающий, каким должно быть значение при возврате вызывающей стороне. Если вы не можете сделать это и просто завершите функцию, не возвращая значение, результатом вызова этой функции будет «Неопределенное поведение» , что означает, что ваша программа может делать все что угодно (включая сбой или удаление всего, что находится на жесткий диск).

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

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

Кроме того, из-за сумасшедшего специального правила языка C ++ функция main может завершаться без оператора return, несмотря на то, что она объявлена ​​как возвращающая int. Не тратьте свое время на поиски логической причины этого исключения, его нет.

1 голос
/ 27 января 2011

Вам необходимо сделать выбор между:

1) Передача по ссылке / значению И возврат INT.

2) Передача по ссылке И возврат недействительным.

Этот выбор зависит от цели вашей функции.

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

Так что либо:

int sqr(int& x)
{
    return x*x;
}

ИЛИ

void sqr(int& x)
{
    x= x*x;
}
...