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

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

#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?

Спасибо.

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

попробуйте следующее:

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

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

2) Передача по ссылке AND return void.

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

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

Итак, либо:

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

ИЛИ

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