функция, возвращающая необязательное значение - PullRequest
1 голос
/ 05 августа 2011

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

int main()
{
      int i;
      scanf("%d",&i);
      printf("Value of i is: ",i);
      return 0;
}

Здесь scanf () возвращает значение 1, но, поскольку оно нигде не отлавливается, почему не выскакивает ошибка? В чем причина такого программирования?

Ответы [ 8 ]

5 голосов
/ 05 августа 2011

Прежде всего потому, что выражения в C также дают значения. Например: x = 1; возвращает значение 1. Иногда вы используете это для многократного назначения, например x = y = 1;, но чаще вы этого не делаете.

В раннем C тип возврата void также не был изобретен, поэтому каждая функция возвращала какое-то значение, было ли оно вообще полезным или нет (например, ваш вызов printf также возвращает значение).

Правила языка не делают это ошибкой (из-за этого теряется совместимость с практически существующим кодом), и поскольку это часто встречается и редко указывает на проблему, большинство компиляторов также не предупреждают об этом. Это делают несколько инструментов lint, что привело к тому, что несколько ошибочных программистов написали что-то вроде (void)printf("whatever"); (то есть приведение неиспользованного возврата к void, чтобы сигнализировать о том, что оно действительно, действительно было преднамеренным, когда его игнорировали. Однако это редко приносит какую-то пользу и часто приносит немало вреда, поэтому (к счастью) его редко можно увидеть.

5 голосов
/ 05 августа 2011

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

1 голос
/ 05 августа 2011

Вам нужно возвращаемое значение в этом примере?NO.Таким образом, вы не использовали это в этом случае.Но в другой ситуации возвращаемое значение может быть важным.Например, если вы хотите прочитать сколько-нибудь целое число, доступное во входном потоке, то вы можете сделать что-то вроде этого:

while (scanf("%d", &i) == 1) {
    // do something
}

Если есть EOF, тогда этот цикл будет прерван.Здесь возвращаемое значение необходимо.

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

0 голосов
/ 05 августа 2011

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

'int main()
{
 int a;   
 printf("Enter a number");
 scanf("%d",&a);
 if(a%2==0)
 printf("even number");
  else
 printf("odd no");
  return 0;
  }'

здесь переменная 'a' не обязательно должна быть возвращена, потому что мы просто хотимпроверить, является ли число четным или нечетным ... не нужно возвращать

0 голосов
/ 05 августа 2011

Простой: если вы не используете возвращаемое значение, вы не используете его.

Это не обязательно, что вы делаете.

(Тем не менее, в случае, какэто, вы должны : в настоящее время вы не знаете, scanf обнаружил ошибку.)

0 голосов
/ 05 августа 2011

Причина в том, что C не имеет другого установленного способа обработки ошибок, кроме возвращаемого значения. Эти возвращаемые значения, то есть возвращаемые в отчет об успехе или неудаче, почти всегда следует проверять (если только вы не бродите по кругу или у вас нет доказательства того, что функция не выйдет из строя).

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

0 голосов
/ 05 августа 2011

Практически каждая нативная функция c возвращает int. scanf и printf включены. Было бы очень неприятно, если бы вам всегда приходилось «захватывать» его, чтобы удовлетворить компилятор; В большой программе вы в конечном итоге создадите тысячи переменных просто для хранения возвращаемых значений, которые вы никогда не просматриваете.

0 голосов
/ 05 августа 2011

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

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