С++ возвращаемое значение без оператора return

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

#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), если в функции int sqr(int &x) нет оператора return?

Спасибо.


person Simplicity    schedule 27.01.2011    source источник
comment
ВТФ? Почему вы хотите написать такой код? Ясно, что sqr — это математическая функция, и нет смысла использовать параметр как вход-выход.   -  person Ilya Kogan    schedule 27.01.2011
comment
@Илья Коган. Просто проверяю, как работает передача по ссылке   -  person Simplicity    schedule 27.01.2011


Ответы (6)


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

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

int sqr(int &x)
{
    return x = x*x;
}
person Fred Foo    schedule 27.01.2011
comment
+1 за -Wall. (Теперь, если бы вы добавили -Werror ... нет, я не могу проголосовать дважды, блин. :-)) - person Christopher Creutzig; 27.01.2011
comment
Это немного менее просто: отсутствие возврата чего-либо в функции с типом возвращаемого значения, отличным от void, приводит к неопределенному поведению, а не только к возврату неопределенного значения. Разница в том, что заявление о том, что он вернет неопределенное значение, означает, что просто игнорируя это значение, все будет в порядке, но это не так. Программа могла вылететь, повредить стек... - person David Rodríguez - dribeas; 27.01.2011
comment
@David, просто чтобы прояснить бит неопределенного поведения и убедиться, что я полностью понимаю проблему; если бы, например, нашим возвращаемым значением было unique_ptr‹T› без оператора return, функция вернула бы мусор вместо T*, который затем был бы интерпретирован вызывающей стороной как допустимый unique_ptr, и даже если бы вы чтобы игнорировать его, деструктор симулированного unique_ptr приведет к сбою вашей программы (надеюсь) при попытке удалить ее указатель. - person enobayram; 04.06.2015

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

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

person sharptooth    schedule 27.01.2011

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

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

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

int sqr(int x)
{
  return x*x;
}
person harper    schedule 27.01.2011
comment
g++ -Wall для предупреждений по умолчанию. Ознакомьтесь с руководством для конкретных предупреждений. - person Fred Foo; 27.01.2011

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

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

person aJ.    schedule 27.01.2011

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

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

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

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

person 6502    schedule 27.01.2011

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

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

2) Передача по ссылке И возврат void.

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

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

Так что либо:

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

OR

void sqr(int& x)
{
    x= x*x;
}
person Jack    schedule 27.01.2011