В чем заключается разница между функциями и операциями
Разница между процедурой и функцией в программировании
Пользователи, далекие от программирования в принципе, сталкиваются с понятиями функции и процедуры редко, и ассоциируются они с чем-то математическим и бюрократическо-медицинским. В программировании же этими понятиями оперирует множество языков, правда, даже специалисты порой не могут четко осознать разницу между функцией и процедурой. Как с тем сусликом: он есть, но его никто не видит. Посмотрим, настолько ли невидимы отличия.
Определение
Функция в программировании — подпрограмма, вызываемая из других подпрограмм необходимое число раз.
Процедура — поименованная часть программы (подпрограмма), многократно вызываемая из последующих частей программы необходимое число раз.
Сравнение
Основная разница между функцией и процедурой — в возвращаемом результате. По сути, и функции, и процедуры представляют собой логически неделимые блоки, из которых складывается код программы. Функция возвращает значение, процедура в большинстве языков программирования — нет, либо (в Си, например) возвращает пустое значение. В последнем случае (в Си) процедура считается подчиненной разновидностью функции.
Заголовок функции содержит слово “function”, идентификатор (собственное имя функции), вариативно список параметров и обязательно — тип результата. В теле функции обязательно прописывается оператор, присваивающий значение имени функции, которое она вернет в качестве результата. Заголовок процедуры содержит слово “procedure”, идентификатор (имя процедуры) и вариативно список параметров. Вызов функции осуществляется в составе выражений там, где эти выражения применяются, вызов процедуры требует отдельного оператора. Вызов процедуры осуществляется только по имени, имя функции же связано с ее значением. На схемах алгоритмов вызов функции изображается в блоке вывода или в блоке процесса, вызов процедуры — в специальном блоке “предопределенный процесс”.
Разница между оператором и функцией в C++?
я мог бы использовать некоторую помощь, понимая следующее В C++, особенно разницу между оператором и функцией:
8 ответов
функция-это конструктор, деструктор, функция преобразования (которая выглядит как operator type() ) или функция оператора (специализация и экземпляр шаблона функции могут дать их в свою очередь).
некоторые операторы имеют встроенный смысл, который может быть изменен программистом. Один относится к встроенному значению оператора просто говоря встроенный оператор (см. 5/3). Однако, если такой оператор применяется к операндам, для которых a встроенный смысл определяется, изменение этого значения допускается только для нескольких случаев (это назначение, адрес и оператор запятой, см. 13.5/6).
на встроенных типах там операции четко определены и неизменяемы.
Для пользовательских типов операторы могут быть определены как синтаксический сахар для вызова функции/метода
мы используем термин функция/метод взаимозаменяемо большую часть времени. Единственное отличие заключается в том, что метод связан с экземпляром объекта класса. В остальном они одинаковы. Они обеспечивают способ группировки набора инструкций вместе.
является определяемым пользователем оператором+ () функцией или оператор?
его функция (или метод). Использование оператора для определенного пользователем типа является синтаксическим сахаром для вызова функции. Они по-прежнему считаются операторами, хотя и в обычном разговоре.
может ли оператор работать с операндами во время компиляции?
для встроенных типов да. Компилятор имеет обширную возможность оптимизировать там использование.
Для пользовательских типов. Он может выполнять оптимизацию операторов так же, как другие функции, которые могут привести к их устранению, но код не выполняется во время компиляции.
Они всегда работают во время компиляции? (например, sizeof () в C++)
нет. sizeof () относительно уникален.
чтобы показать, что оператор в пользовательском классе ведет себя так же, как функции, вот пример использования mem_fun_ref
нет никакой существенной разницы между операторами и функциями, за исключением того, что операторы имеют другой синтаксис. Однако примитивные операторы не являются функциями.
An оператор обычно это операция, выполняемая с переменной, заданной некоторой формой пунктуации. Например, поведение по умолчанию operator+ между двумя целыми числами, чтобы добавить их.
является ли определяемый пользователем оператор + () функцией или оператором?
может ли оператор работать с операндами во время компиляции? Они всегда работают во время компиляции? (например, sizeof () в C++)
нет, sizeof не могут быть перегружены. Если вы хотите, чтобы какая-то форма операции времени компиляции была выполнена, вам нужно использовать что-то вроде метапрограммирование шаблона. Обратите внимание, что если компилятор может выполнить расчет во время компиляции, он может отменить вызов в перегруженного оператора, конечно.
Это функция или, точнее, метод экземпляра, в том смысле, что это то, что вызывается.
нет огромной разницы между функциями и операторами. Вы можете думать об операторе using, например, «a+b», как о ярлыке для оператора функции+(a, b), который определен для типов a и b. Конечно, операторы на примитивных типах (например, целые числа) и несколько других исключений не обязательно определяются так.
таким образом, чтобы ответить на ваши конкретные вопросы:
является определяемым пользователем оператором+ () функцией или оператор?
функция, реализующая оператор.
может ли оператор работать с операндами во время компиляции? Они всегда работают во время компиляции?
поскольку это функция, она работает во время выполнения, но в некоторых случаях оптимизация компилятора может работать во время компиляции для определенных операторов. Я не на 100% уверен, почему вы спрашиваете об этом, поэтому, возможно, есть что-то, о чем я не знаю.
есть только два незначительных различий между функциями и операторами.
вот некоторые различия между оператором и функции:
оператор не помещает свои параметры в стек, но функция помещает свои параметры в стек.
компилятор знает о работе операторов, но не знает выхода из функции. Сказанное по-другому, действие оператора определяется во время компиляции, а действие функции определяется в во время выполнения.
В чем разница между «функцией» и «процедурой»?
вообще говоря, мы все слышим о функции или процедуры в языках программирования. Однако я только что узнал, что я использую эти термины почти взаимозаменяемо (что, вероятно, очень неправильно).
в чем разница с точки зрения их функциональности, их назначения и использования?
пример был бы признателен.
17 ответов:
функция возвращает значение, а процедура просто выполняет команды.
имя функции происходит от математики. Он используется для вычисления значения на основе входных данных.
процедура-это набор команд, которые могут быть выполнены по порядку.
в большинстве языков программирования, даже функции могут иметь набор команд. Следовательно, разница заключается только в возврате части значения.
но если вы хотите сохранить функцию в чистоте, (просто посмотрите на функциональные языки), вам нужно убедиться, что функция не имеет побочного эффекта.
в языках, подобных Паскалю, функции и процедуры являются различными сущностями, отличающимися тем, возвращают ли они значение или нет. Они ведут себя по-разному относительно. синтаксис языка (например. процедура вызывает операторы формы; вы не можете использовать вызов процедуры внутри выражения, а вызовы функций не формируют операторы, вы должны использовать их в других операторах). Поэтому программисты, воспитанные Паскалем, различают их.
В C-like языки и многие другие современные языки, это различие исчезло; в статически типизированных языках процедуры-это просто функции с забавным типом возврата. Вероятно, поэтому они взаимозаменяемы.
хотя вы должны отметить, что стандарт C не говорит о процедурах, а только о функциях.
В общем, процедура представляет собой последовательность инструкций.
Функция может быть такой же, но она обычно возвращает результат.
есть такой термин подпрограмма или подпрограмма что означает параметризованный фрагмент кода, который может быть вызван из разных мест.
функции и процедуры реализации этих. Обычно функции возвращают значения, а процедуры ничего не возвращают.
Основные Различия
Дополнительные Различия
в SQL:
более строго, функция f подчиняется свойству, что f(x) = f (y), если x = y, т. е. она вычисляет тот же результат каждый раз он вызывается с одним и тем же аргументом (и, таким образом, он не изменяет состояние системы.)
таким образом, rand() или print(«Hello») и т. д. не функции, а процедуры. В то время как sqrt(2.0) должен быть функцией: нет никакого наблюдаемого эффекта или изменения состояния независимо от того, как часто его вызывают, и он всегда возвращает 1.41 и некоторые.
внутри процедуры мы можем использовать операторы DML (Insert /Update/Delete), но внутри функции мы не можем использовать операторы DML.
процедура может иметь оба входных\выходных параметра, но функция может иметь только входной параметр.
мы можем использовать блок Try-Catch в хранимой процедуре, но в функции мы не можем использовать блок Try-Catch.
мы не можем использовать хранимую процедуру в инструкции Select, но в функции мы можем использовать в инструкции Select.
сохраненные Процедура может возвращать 0 или n значений (максимум 1024), но функция может возвращать только 1 значение, которое является обязательным.
хранимая процедура не может быть вызвана из функции, но мы можем вызвать функцию из хранимой процедуры.
мы можем использовать транзакцию в хранимой процедуре, но в функции мы не можем использовать транзакцию.
мы не можем использовать хранимую процедуру в инструкции Sql в любом месте в разделе Where/Having/select, но в функции мы можем использовать.
мы не можем присоединиться Хранимая процедура, но мы можем присоединиться к функции.
в большинстве случаев: функция возвращает значение, а процедура нет. Оба куска кода сгруппированы вместе, чтобы сделать то же самое.
в контексте функционального программирования (где все функции возвращают значения), функция является абстрактным объектом:
здесь f-та же функция, что и g, но это другая процедура.
Если мы здесь языковые агностики,процедура обычно определяет ряд действий, необходимых для надежного и идемпотентного достижения определенного результата. То есть процедура-это в основном алгоритм.
функции, с другой стороны, несколько независимых частей кода в рамках более крупной программы. Другими словами, функция-это реализация процедуры.
функция возвращает значение, а процедура просто выполняет команды.
имя функции происходит от математики. Он используется для вычисления значения на основе входных данных.
процедура-это набор команд, которые могут быть выполнены по порядку.
в большинстве языков программирования, даже функции могут иметь набор команд. Следовательно, разница заключается только в возврате части значения.
но если вы хотите сохранить функцию в чистоте, (просто посмотрите на функциональные языки), вам нужно убедиться, что функция не имеет побочного эффекта.
функция может использоваться в инструкции sql, тогда как процедура не может использоваться в инструкции sql.
инструкции Insert, Update и Create не могут быть включены в функцию, но процедура может иметь эти инструкции.
процедура поддерживает транзакции, но функции не поддерживают транзакции.
функция должна возвращать одно и только одно значение (другое может быть возвращено переменной OUT), но процедура возвращает столько наборов данных и возвращает ценности.
планы выполнения обеих функций и процедур кэшируются, поэтому производительность одинакова в обоих случаях.
Я возражаю с чем-то, что я продолжаю видеть снова и снова в большинстве этих ответов, что делает функцию функцией, так это то, что она возвращает значение.
функция-это не просто метод, который возвращает значение. Не так: чтобы метод был реальной функцией, он должен возвращать одно и то же значение, всегда заданное конкретным входом. Примером метода, который не является функцией, является random метод в большинстве языков, потому что, хотя он возвращает значение значение не всегда тот же.
вот еще один пример метода, который не является функцией, но в противном случае все равно вернет a значение.
Я также возражаю против того, что процедуры не возвращают значения. Процедура-это просто определенный способ говорить о функции или метода. Таким образом, это означает, что если базовый метод, который ваша процедура определяет или реализует, возвращает значение, то угадайте, что эта процедура возвращает значение. Возьмем для примера следующий фрагмент SICP:
вы много слышали о рекурсивных процедурах в последнее время? Они разговаривают о рекурсивной функции (реальной функции), и она возвращает значение, и они используют слово «процедура». Так в чем же тогда разница?
(Примечание, Если Вы читаете эту главу по ссылке, которую я вам предоставляю, вы можете обнаружьте, что более трудное для понимания понятие-это не различие между функцией и процедурой, а процесс и процедура. Знаете ли вы, что рекурсивная процедура может иметь итерационный процесс?)
представление этой машины может выглядеть как
конечно, это не единственный способ сделать пирог.
в этом случае мы видим, что:
эта аналогия в порядке, но она ломается, когда вы принимаете во внимание, что когда вы имеете дело с компьютерной программой, все является абстракцией. Так что в отличие от рецепта с машиной мы сравниваем две вещи, которые сами по себе являются абстракциями; две вещи, которые могли бы быть тем же самым. И я держу это они (для всех намерений и целей) одно и то же.
в контексте db: Хранимая процедура-это precompiled план выполнения, где as функции не являются.
Primary tabs
Forums:
Сначала уточним, что такое оператор, а что такое функция (речь идёт о высокоуровневывх языках программирования типа Pascal или, скажем, PHP)
Чего общего
И сразу отметим что и оператор и функция выполняют какую-то операцию (действие) над данными, в потому в смысле философском, или, скажем, математическом, они ничем не отличаются, просто «оформляется» это действие несколько разными способами, о чем мы и поговорим.
Что такое оператор
— прежде чем читать дальше отметьте себе, что данные часто пишутся «сбоку» от оператора, например у бинарных операторов (тех, что принимают два значения, как этот оператор суммы) данные часто записываются справа и слева (подробнее см. например в заметке об операторах и присваивании в Паскаль).
Что такое «функция»
Теперь поговорим о том, как вызываются функции. Например, вот тут описана пользовательская функция (то есть такая, которой изначально в вашем языке программирования не было), которая делает то же, что оператор суммы, а именно складывает два числа:
Какая разница (запись в коде)
Пришло время проговорить о разнице между тем что называют оператором и тем что называют функцией.
Итак ещё раз, предположим, что в вашем языке программирования есть:
Тогда с использованием оператора это делается так:
А с использованием функции так:
— как мы видим и тот и тот подход производит действие над данными, но запись различна. Операторы обычно используются в «школьном» смысле, то есть данные находятся справа и слева, например, как в операторах работы с остатком в Паскале.
Таким образом, мы видим, что если бы была возможность определить (создать) функцию с именем «+» (из одного символа), то мы могли бы делать такой вызов, для сложения:
ну или с записью в переменную:
— но обычно так не пишут (да и многие языки не дают создавать функции, имена которых совпадают с записью операторов).
То есть разные формы записи связаны скорее с традицией и удобством восприятия.
Перейдём к выводам.
Выводы
Чем похожи функции и операторы:
Чем отличается функция от оператора:
9. Процедуры и функции
Процедуры и функции представляют собой относительно самостоятельные фрагменты программы, оформленные особым образом и снабженные именем. Упоминание этого имени в тексте программы называется вызовом процедуры (функции). Отличие функции от процедуры заключается в том, что результатом исполнения операторов, образующих тело функции, всегда является некоторое значение, поэтому обращение к функции можно использовать в соответствующих выражениях наряду с переменными и константами. Обобщенно процедуры и функции будем называть подпрограммами.
Верхняя строка процедуры называется заголовком процедуры и состоит из служебного слова procedure, названия функции, списка параметров и точки с запятой. Следом идут операторные скобки begin-end, называемые телом процедуры. После end обязательно ставится точка с запятой. Процедура может не иметь параметров, в этом случае ставить скобки необязательно.
Заголовок функции отличается тем, что вместо слова procedure пишется function, а после списка параметров или имени (если нет параметров) идет двоеточие и тип результата, который возвращает функция. Вызов встроенной или пользовательской подпрограммы имеет следующий синтаксис:
Если подпрограмма не имеет параметров, то скобки необязательны. Имя подпрограммы должно быть уникальным в пределах модуля и других подключаемых модулей и не должно совпадать с именами встроенных.
В подпрограмме могут быть объявлены локальные переменные, видимые только в теле подпрограммы. Раздел объявления переменных находится между заголовком и телом. Пример:
Имена локальных переменных могут совпадать с именами глобальных переменных. В этом случае использоваться будет локальная переменная.
Параметры процедур и функций
Синтаксис описания параметров разберем на примере:
Параметры в заголовке подпрограммы называются формальными параметрами. Параметры, передаваемые при вызове подпрограммы, называются фактическими.
Параметры одного типа отделяются запятой, после двоеточия указывается тип параметра. Параметры разных типов отделяются точкой с запятой. Список и тип формальных и фактических параметров должен совпадать. За этим следит компилятор.
Параметры, передаваемые в подпрограмму, делятся на:
Пример вызова функции:
В случае с параметрами-значениями и параметрами-константами тип формального и фактического параметра может быть совместимым. Если формальный определен как целое число, то фактический параметр может быть любого целого типа. Только нужно следить, чтобы формальный параметр мог «вместить» фактический параметр. В данном примере тип формального параметра Y «вмещает» переменную a, т. к. область допустимых значений больше. Целый формальный параметр несовместим с другими типами, в том числе с вещественными. А вот вещественный формальный параметр, совместим с целыми и вещественными.
В случае с параметрами-переменными требуется строгое соответствие типов, даже если формальный и фактический параметры являются родственными, например целыми. Т. е. если формальный параметр имеет тип Integer, то фактический параметр тоже должен иметь тип Integer, а не Byte, Word и т. д. Это касается и классов, даже если фактический параметр является потомком класса формального параметра.
Передача массивов в качестве параметров
Для передачи массива в подпрограмму должен быть определен пользовательский тип:
Фактический параметр должен быть переменной массива.
Компилятор не сообщит об ошибке, если объявить параметр-массив таким образом:
Однако во время выполнения вы получите ошибку «type mismatch».
В Паскале есть так называемые открытые массивы. Синтаксис формального параметра открытого массива следующий:
Открытый массив представляет собой одномерный массив. Нижняя граница массива всегда равна 0, даже если нижняя граница передаваемого массива отличается. Соответственно, верхняя граница равна длине массива минус 1. Для определения границ массива можно воспользоваться функциями Low и High. Пример:
Как видно из примера фактическим параметром может быть не только переменная, но и конструктор массива, который представляет собой перечисление элементов через запятую, заключенных в квадратные скобки.
В движке не поддерживаются вариантные открытые массивы, хотя некоторые встроенные подпрограммы имеют параметры такого типа (например, Format).
Возврат значения функции
Функция имеет предопределенную переменную Result, в которую сохраняется возвращаемое значение. Пример:
Выход из подпрограммы
В любой момент можно выйти из подпрограммы. Для этого предусмотрен оператор Exit.
В движке не поддерживается передача в EXIT возвращаемого значения.