возвращаемое значение с ++ - PullRequest
2 голосов
/ 25 августа 2010

У меня есть следующий код на C ++:

    int fff ( int a , int b )
{
   if (a>b )
      return 0;
   else a+b ; 
}

, хотя я не писал 'return', иначе это не делает ошибку!
в main (), когда я написал:

cout<<fff(1,2);

это напечатано 1?Как это случилосьМожно ли это объяснить?

Ответы [ 4 ]

5 голосов
/ 25 августа 2010

Это то, что называется неопределенное поведение . Все может случиться.

C ++ не требует, чтобы вы всегда возвращали значение в конце функции, потому что возможно написать код, который туда никогда не попадет:

int fff ( int a , int b )
{
   if (a>b )
      return 0;
   else return a+b;

   // still no return at end of function
   // syntactically, just as bad as original example
   // semantically, nothing bad can happen
}

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

И если вы это сделаете, вы можете получить случайное значение или вылететь.

2 голосов
/ 25 августа 2010

$ 6.6.3 / 2- "Стекает с конца функция эквивалентна возврату без значения; это приводит к неопределенное поведение в функция, возвращающая значение. "

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

Здесь

остальное a + b;

трактуется как выражение без каких-либо побочных эффектов.

0 голосов
/ 25 августа 2010

Хороший компилятор (например, gcc) выдаст предупреждение, если вы допустите такую ​​ошибку, и будет иметь переключатель командной строки, чтобы возвращать ненулевой статус ошибки, если были обнаружены какие-либо предупреждения. Это неопределенное поведение: результат, который вы видите, это то значение, которое было в том месте, где компилятор обычно ожидал использовать функцию, возвращающую int: например, регистр аккумулятора или какое-то место в стеке. Ваш код не копирует a + b в это место, поэтому вместо него будет видно все, что было добавлено последним. Тем не менее, вы даже не гарантированно получите результат - какой-то компилятор / архитектура может сделать что-то, что может привести к сбою машины, если у функции не было оператора return: например - pop () значение из стека в предположении это возвращение толкнуло один - будущее использование стека (включая чтение адресов возврата функции) может затем получить результаты из адреса памяти выше или ниже предполагаемого.

0 голосов
/ 25 августа 2010

«случайное» возвращаемое значение определяется значением регистра ЦП после вызова, поскольку регистр равен 1 после вызова, поэтому значение равно 1.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...