Разница между функцией и процедурой? - PullRequest
2 голосов
/ 17 марта 2011

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

Ответы [ 3 ]

2 голосов
/ 17 марта 2011

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

Подробнее на Suite101: Процедура, подпрограмма или функция ?: Терминология программирования 101 - взгляд на различия в подходе и определении процедур, подпрограмм и функций. http://www.suite101.com/content/procedure--subroutine-or-function--a8208#ixzz1GqkE7HjE

1 голос
/ 17 марта 2011

В С и его производных термин «процедура» используется редко.В C есть функции, некоторые из которых возвращают значение, а некоторые нет.Я думаю, что это артефакт наследия C, где до введения void в ANSI C не было способа , а не вернуть значение.По умолчанию функции возвращают int, который можно игнорировать (можно по-прежнему) и может быть случайным числом, если не указано явное возвращаемое значение.

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

Поскольку мы говорим об Objective-C, существуют некоторые дополнительные проблемы, которые могут сбить вас с толку.Функции, связанные с классом или объектом, называются «методами» (методы класса и методы экземпляра соответственно).

Также, если мы педантичны, вы не вызываете методы Objective-C, вы вызываете их, отправляя сообщение объекту.Различие на самом деле очень важно, потому что имя сообщения (он же «селектор») не обязательно всегда ссылается на один и тот же метод, оно может быть изменено во время выполнения.Это принципиально отличается от языков, таких как Java и C ++, где конкретное имя метода для определенного класса на самом деле является просто символическим именем для адреса блока кода, составляющего тело метода.

1 голос
/ 17 марта 2011

В зависимости от языка программирования, различие может быть не таким четким.Давайте возьмем консервативный язык: Pascal :

  • procedure действительно не имеет возвращаемого значения.Он используется для операций, которые не имеют возвращаемого значения или имеют несколько возвращаемых значений.В последнем случае несколько аргументов (return-arguments или output-arguments) передаются по ссылке (с использованием ключевого слова var), и их значения напрямую изменяются изнутри процедуры.(Обратите внимание, что этот последний случай не может считаться хорошей практикой, в зависимости от обстоятельств).
  • function имеет одно возвращаемое значение, и обычно мы не ожидаем, что оно изменит значение любого из его аргументов(какие аргументы затем могут быть переданы по значению или через ключевое слово const).Несколько возвращаемых значений могут быть возвращены путем объединения их в запись.

C или Java не различает синтаксически, поэтому функция типа возвращаемого значения void можно рассматривать как процедуру. Scala различается по наличию знака равенства между заголовком метода и телом метода.

Обычно , независимо от того, насколько фактическимязык вызывает его конструкцию, мы в идеале ожидаем, что

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

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

...