Яка різниця між "функцією" та "процедурою"?


203

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

Отже, моє питання:

У чому різниця з точки зору їх функціональності, їх призначення та використання?

Приклад був би вдячний.


Дивіться також: stackoverflow.com/q/10388393/974555
Герріт

6
Я думаю, що SICP отримує це право. Функції існують тільки в математиці, і вони являють собою те , що це знання. Процедури існують в мовах програмування (включаючи функціональні), і вони представляють як знання. Функція : sqrt (x) = y така, що y ^ 2 = x. Процедура : (define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0)).
mk12

Відповіді:


295

Функція повертає значення, і процедура просто виконує команди.

Функція імені походить від математики. Він використовується для обчислення значення на основі вхідних даних.

Процедура - це набір команд, який може виконуватися в порядку.

У більшості мов програмування навіть функції можуть мати набір команд. Отже, різниця полягає лише у частині, що повертається.

Але якщо ви хочете підтримувати функцію в чистоті, (просто подивіться на функціональні мови), вам потрібно переконатися, що функція не має побічного ефекту.


Як можна запевнити відсутність побічних ефектів ні в імперативі (java, c), ні в декларативній мові (scala, схема)?
orlybg

1
@orlybg, у декларативних мовах послідовність виходить від реалізації мови. Їх обмеження щодо застосування запобігають появі побічних ефектів. З іншого боку, імперативні мови явно експлуатують свої побічні ефекти. Побічні ефекти не завжди погані.
Tharindu Rusira

Я читаю наступний підручник з Ada ( goanna.cs.rmit.edu.au/~dale/ada/aln/8_subprograms.html ), де другий абзац цієї сторінки починається з "Процедури в Ada схожі з процедурами в Pascal . Процедура може містити заяви повернення. " Це помилка в тексті? Або це означає, що він може мати оператори повернення, але не повертати жодних значень?
jviotti

3
У мові Pascal процедури не мають операторів повернення, виконують лише функції. Повинно бути помилкою в тексті. Однак процедура може мати операцію "вихід", який може діяти як "повернення" без аргументів, що не має значення повернення.
Ерік Фортьє

Функція може отримувати входи і повертати лише лише вихід. процедура або макрос можуть отримувати введення даних і не повертати жодних даних, виконуючи лише кількість операторів. Основна відмінність - процедура не може повернути будь-який тип даних.
EsmaeelE

42

Це залежить від контексту.

У мовах, подібних до Паскаля, функції та процедури - це окремі сутності, що відрізняються тим, чи вони повертають значення, чи не повертають його. Вони поводяться інакше. синтаксис мови (наприклад, процедура викликів форми операторів; ви не можете використовувати виклик процедури всередині виразу проти функцій, виклики не формують оператори, ви повинні використовувати їх в інших операторах). Тому програмісти, які розводять Паскаля, розрізняють між собою.

У мовах, подібних С, та багатьох інших сучасних мов цього розходження немає; в мовах статичного типу, процедури - це лише функції із смішним типом повернення. Можливо, тому вони використовуються взаємозамінно.

У функціональних мовах зазвичай немає такого поняття, як процедура - все є функцією.


і документація мов програмування може викликати функції та процедури, що завгодно, тому що люди приймуть будь-яке ім’я, оскільки фон за цими назвами давно вимитий.
Арн Бабенгаузереїд

18

Приклад в C:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

Хоча слід зазначити, що стандарт C не говорить про процедури, а лише про функції.


4
... Стандарт C не говорить про процедури, а лише про функції. Це тому, що він має лише функції. Функція, яка нічого не повертає, є a void function. Керніган і Річі Ч. 1.7: "У С функція еквівалентна підпрограмі або функції у Фортран, або процедурі, або функції в Паскалі." Іншими словами ... ця відповідь неправильна.
Могсдад

8
Відповідь не є помилковою, і це хороший приклад різниці між чистими функціями та процедурами. K&R називав кожну підпрограму "функцією", щоб простоти речі, але підпрограма з побічними ефектами насправді є "процедурою", а не "функцією" в канонічному сенсі з математики. C може бути кращою мовою, якби він відрізняв реальні функції від процедур, це допомогло б статичному аналізу, оптимізації продуктивності та паралелізації.
Сем Уоткінс

12

Загалом, процедура - це послідовність інструкцій.
Функція може бути однаковою, але вона зазвичай повертає результат.


11

Існує термін підпрограма або підпрограма яка означає параметризований фрагмент коду, який можна викликати з різних місць.

Функції та процедури - це реалізація цих. Зазвичай функції повертають значення і процедури нічого не повертають.


6

Основні відмінності

  • Функція повинна повертати значення, але в Збережених процедурах це необов'язково: процедура може повернути 0 або n значень.
  • Функції можуть мати лише вхідні параметри для нього, тоді як процедури можуть мати параметри вводу / виводу.
  • Для функції обов'язково потрібно взяти один вхідний параметр, але збережена процедура може зайняти від 0 до n вхідних параметрів.
  • Функції можна викликати з процедури, тоді як процедури не можна викликати з функції.

Розширені відмінності

  • Винятки можуть бути оброблені блоками пробного захоплення в Процедурі, тоді як блок-спробу-лов не можна використовувати у функції.
  • Ми можемо перейти до управління транзакціями в процедурі, тоді як у функції ми не можемо.

У SQL:

  • Це процедура дозволяє SELECTяк DML ( INSERT, UPDATE, DELETE) звітності в ньому, в той час як функція дозволяє тільки SELECTзаяву в ньому.
  • Процедури не можуть бути використані в SELECTоператорі, тоді як Функції можуть бути вбудовані в SELECTоператор.
  • Збережені процедури не можна використовувати в операторах SQL ніде в блоці WHERE(або a HAVINGабо a SELECT), тоді як функції можуть.
  • Функції, які повертають таблиці, можна розглядати як інший Rowset. Це можна використовувати в JOINблоці з іншими таблицями.
  • Вбудовані функції можна розглядати як представлення, які приймають параметри і можуть використовуватися в JOINблоках та інших операціях Rowset.

3
Ця відповідь дуже специфічна для мови, тоді як питання було мовно-агностичним. Висловлювання тут не всі правдиві в загальному випадку, але було б корисно, якщо ви уточнили мову чи середовище, на яке ви їх стверджуєте.
Могсдад

5

Більш суворо, функція f підкоряється властивості, що f (x) = f (y), якщо x = y, тобто вона обчислює той самий результат кожного разу, коли вона викликається одним і тим же аргументом (і, таким чином, вона не змінює стан система.)

Таким чином, rand () або print ("Hello") тощо - це не функції, а процедури. Хоча sqrt (2.0) має бути функцією: немає спостережуваного ефекту чи зміни стану незалежно від того, як часто хтось викликає його, і він повертає завжди 1,41 та деякі.


3
Це використання відносне в контексті "функціонального" програмування. Майте на увазі, що для багатьох (часто імперативних) мов, які називають свої підпрограми "функціями", ця властивість не потрібна.
dmckee --- кошеня колишнього модератора

1
Я не припускав, що мови програмування вимагають цього властивості. У будь-якому випадку, можна писати суворі функції будь-якою мовою, і я вважаю, що корисно запрограмувати якомога більше на чистих функціях, а потім склеїти шматки разом з якоюсь основною процедурою.
Інго

4

Якщо ми тут мова-агностик, процедура зазвичай визначає низку дій, необхідних для надійного та безсильного досягнення певного результату. Тобто процедура в основному є алгоритмом.

Функції, з іншого боку, є дещо незалежним фрагментом коду в межах більшої програми. Іншими словами, функція - це реалізація процедури.


4

Це добре відоме старе питання, але я хотів би поділитися ще кількома ідеями щодо сучасних досліджень та дизайну мови програмування.

Основна відповідь

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

Функція більше , ніж процедури , оскільки повернені значення також можуть бути задані як «вихід» в організмі. Виклики функцій більш-менш аналогічні процедурним викликам, за винятком того, що ви також можете використовувати результат виклику функції синтаксично (як правило, як піддепресія якогось іншого виразу).

Традиційно виклики процедур (а не виклики функцій) використовуються для вказівки на те, що вихід не повинен бути зацікавленим, і повинні бути побічні ефекти, щоб уникнути виклику без відключення, отже, підкреслюючи загальну парадигму програмування . Багато традиційних мов програмування, як Pascal, забезпечують як "процедури", так і "функції", щоб розрізнити цю навмисну ​​різницю стилів.

(Щоб було зрозуміло, згадані вище "введення" та "вихід" є спрощеними поняттями, заснованими на синтаксичних властивостях функцій. Багато мов додатково підтримують передавання аргументів параметрам шляхом посилання / спільного доступу, щоб користувачі могли передавати інформацію, закодовану в аргументи під час викликів. . Такий параметр може навіть називатися як "параметр вводу / виходу". Ця функція заснована на природі об'єктів, що передаються у викликах, що є ортогональним властивостям функції процедури / функції.)

Однак якщо результат виклику функції не потрібен, його можна просто (принаймні логічно) ігнорувати, а визначення функції / виклики функції повинні відповідати визначенню процедури / викликам процедури таким чином. Мови, подібні до ALGOL, такі як C, C ++ та Java, всі надають функцію "функція" таким чином: кодуючи тип результату voidяк особливий випадок функцій, схожих на традиційні процедури, не потрібно надавати функцію "процедур" "окремо. Це запобігає деякому роздуванню мовної конструкції.

Оскільки SICP згадується, також варто відзначити, що в мові схеми, визначеній R n RS , процедура може або не повинна повертати результат обчислення. Це об'єднання традиційних "функцій" (повернення результату) і "процедури" (повернення нічого), по суті, аналогічних концепції "функції" багатьох мов, схожих на ALGOL (і фактично діленням ще більших гарантій, таких як додаткові оцінки операнди перед викликом). Однак відмінності від старої моди все ще існують навіть у таких нормативних документах, як SRFI-96 .

Я не знаю багато про точні причини розбіжності, але, як я пережив, здається, що мовні дизайнери стануть щасливішими без конкретизації в даний час. Тобто, «процедура» як окрема функція непотрібна. Таких методів, як voidтип, вже достатньо для позначення застосування, де слід підкреслити побічні ефекти. Це також більш природно для користувачів, які мають досвід роботи на мовах, схожих на С, які користуються популярністю більше кількох десятиліть. Більше того, це дозволяє уникнути збентеження у таких випадках, як R n RS, де "процедури" насправді є "функціями" в більш широкому сенсі.

Теоретично функцію можна вказати із заданим типом одиниці як тип результату виклику функції, щоб вказати, що результат є спеціальним. Це відрізняє традиційні процедури (коли результат дзвінка незацікавлений) від інших. У дизайні мови існують різні стилі:

  • Як і в R n RS, просто позначення незацікавлених результатів як "не визначене" значення (не визначеного типу, якщо мова має його згадати), і його досить ігнорувати.
  • Вказівка незацікавлених результату як значення виділеного типу пристрою (наприклад , Kernel «s #inert) також працює.
  • Якщо цей тип є нижчим типом , його можна (сподіваємось) статично перевірити і запобігти використанню як тип вираження. voidТипу в Алгол-подібних мовах саме приклад цієї техніки. ISO C11 _Noreturn- подібний, але більш тонкий у цьому виді.

Подальше читання

Як традиційне поняття, що випливає з математики, є тонни чорної магії, які більшість людей не намагаються знати. Строго кажучи, ви, швидше за все, не зрозумієте все, що виходить з ваших математичних книг. CS книги також не можуть надати великої допомоги.

Щодо мов програмування, то існує декілька застережень:

  • Функції в різних галузях математики не завжди визначаються, мають однакові значення. Функції в різних парадигмах програмування також можуть бути зовсім різними (навіть іноді синтаксиси виклику функції виглядають схоже). Іноді причини, що викликають відмінності, однакові, але іноді їх немає.
    • Це ідіоматичне моделі обчислень з допомогою математичних функцій , а потім реалізувати в основний розрахунок на мовах програмування. Будьте обережні, щоб уникнути відображення їх один на один, якщо ви не знаєте, про що говорять.
  • Не плутайте модель з об'єктом, що моделюється.
    • Останнє - лише одна із реалізацій до першої. Вибору може бути більше, ніж залежно від контексту (наприклад, галузі математики, що цікавлять).
    • Зокрема, більш-менш абсурдно трактувати "функції" як "відображення" або підмножини декартових продуктів, як трактувати натуральні числа як кодування фон-Ноймана порядкових порядків (схожий на купу {{{}}, {}}...), крім деяких обмежених контекстів .
  • Математично функції можуть бути частковими або тотальними . Різні мови програмування тут по-різному трактуються.
    • Деякі функціональні мови можуть вшановувати сукупність функцій, щоб гарантувати, що обчислення в функціональних викликах завжди закінчуються кінцевими кроками. Однак це, по суті, не є повним Тьюрінгом, отже, слабшою обчислювальною виразністю, і мало що спостерігається в мовах загального призначення, окрім семантики перевірки типу (яка, як очікується, буде загальною).
    • Якщо різниця між процедурами та функціями є значною, чи повинні існувати "тотальні процедури"? Хм ...
  • Конструкти, подібні до функцій у калькуляціях, що використовуються для моделювання загальних обчислень та семантики мов програмування (наприклад, лямбда-абстракції в лямбда-обчисленнях ), можуть мати різні стратегії оцінювання на операндах.
    • У традиційних скороченнях чистих обчислень, а також як оцінювання виразів у чистих функціональних мовах немає побічних ефектів, що змінюють результати обчислень. Як результат, операнди не повинні бути оцінені перед тілом конструктоподібних конструкцій (оскільки інваріант для визначення "однакових результатів" зберігається за властивостями, такими як β- еквівалентність, гарантована властивістю Черч-Россера ).
    • Однак багато мов програмування можуть мати побічні ефекти під час оцінювання виразів. Це означає, що суворі стратегії оцінювання, такі як додаткове оцінювання , не є однаковими до тих, що не суворо оцінюються, як " за потребою" . Це важливо, оскільки без розрізнення не потрібно відрізняти функціональні (тобто використовувані з аргументами) макроси від (традиційних) функцій. Але залежно від аромату теорій, це все ж може бути артефактом. Це, в більш широкому розумінні, функціонально схожі макроси (особливо гігієнічні ) - це математичні функції з деякими зайвими обмеженнями (синтаксичні фази). Без обмежень, може бути розумним трактувати (першокласні) функціональні макроси як процедури ...
    • Для читачів, зацікавлених у цій темі, врахуйте деякі сучасні абстракції .
  • Процедури зазвичай розглядаються поза сферою традиційної математики. Однак у моделях розрахунків, що моделюють семантику обчислень та мов програмування, а також сучасні конструкції мови програмування, може бути досить велике сімейство споріднених понять, що мають спільний характер "дзвінка". Деякі з них використовуються для впровадження / розширення / заміни процедур / функцій. Є ще більш тонкі відмінності.

3

У більшості контекстів: функція повертає значення, а процедура - ні. Обидва - це фрагменти коду, згруповані разом, щоб зробити те саме.

У контексті функціонального програмування (де всі функції повертають значення) функція є абстрактним об'єктом:

f(x)=(1+x)
g(x)=.5*(2+x/2)

Тут f - та сама функція, що і g, але це інша процедура.


3

Всередині процедури ми можемо використовувати оператори DML (Insert / Update / Delete), але функцією Inside ми не можемо використовувати оператори DML.

Процедура може мати обидва вхідні / вихідні параметри, але функція може мати лише вхідний параметр.

Ми можемо використовувати блок Try-Catch у збереженій процедурі, але у функції ми не можемо використовувати блок Try-Catch.

Ми не можемо використовувати Збережену процедуру в операторі Select, але у функції ми можемо використовувати у операторі Select.

Збережена процедура може повернути 0 або n значень (максимум 1024), але функція може повернути лише 1 значення, яке є обов'язковим.

Збережену процедуру не можна викликати з функції, але ми можемо викликати функцію із збереженої процедури.

Ми можемо використовувати транзакції в Збереженій процедурі, але у функції ми не можемо використовувати транзакції.

Ми не можемо використовувати Збережену процедуру в операторі Sql будь-де в розділі «Де / Маючи / Вибір», але в функції ми можемо використовувати.

Ми не можемо приєднатися до збереженої процедури, але ми можемо приєднатися до функції.

для більше .. натисніть тут ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-bet between-stored-procedure-and.html


2
Ця відповідь дуже специфічна для мови, тоді як питання було мовно-агностичним. Висловлювання тут не всі правдиві в загальному випадку, але було б корисно, якщо ви уточнили мову чи середовище, на яке ви їх стверджуєте.
Могсдад

Ця відповідь є абсолютно невірною для переважної більшості мов програмування. Процедури мають лише вхідні параметри, а функції мають і вхід, і вихід.
AStopher

2

Функція повертає значення, і процедура просто виконує команди.

Функція імені походить від математики. Він використовується для обчислення значення на основі вхідних даних.

Процедура - це набір команд, який може виконуватися в порядку.

У більшості мов програмування навіть функції можуть мати набір команд. Отже, різниця полягає лише у частині, що повертається.

Але якщо ви хочете підтримувати функцію в чистоті, (просто подивіться на функціональні мови), вам потрібно переконатися, що функція не має побічного ефекту.


1

Функцію можна використовувати в операторі sql, тоді як процедуру не можна використовувати в операторі sql.

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

Процедура підтримує транзакції, але функції не підтримують транзакції.

Функція повинна повертати одне і тільки одне значення (інше можна повернути змінною OUT), але процедура повертає стільки наборів даних і повертає значення.

Плани виконання обох функцій та процедур кешовані, тому продуктивність однакова в обох випадках.


1

Я заперечую проти чогось, що я бачу знову і знову в більшості цих відповідей, що те, що робить функцію функцією, це те, що вона повертає значення.

Функція - це не будь-який старий метод, який повертає значення. Не так: для того, щоб метод був реальною функцією, він повинен повертати одне і те ж значення завжди з певним входом. Прикладом методу, який не є функцією, є randomметод більшості мов, оскільки, хоча він повертає значення, значення не завжди є однаковим.

Отже, функція більше схожа на карту (наприклад, де x -> x'для одновимірної функції). Це дуже важлива відмінність між звичайними методами та функціями, оскільки при роботі з реальними функціями терміни та порядок їх оцінювання ніколи не мають значення, де це не завжди відбувається з нефункціональними функціями.

Ось ще один приклад методу, який не є функцією, але в іншому випадку все одно поверне значення.

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

Далі я заперечую проти того, що процедури не повертають значення. Процедура - це лише специфічний спосіб розмови про функцію чи метод. Тож це означає, що якщо основний метод, який ваша процедура визначає або реалізує, повертає значення, то вгадайте, що ця процедура повертає значення. Візьмемо для прикладу наступний фрагмент з SICP :

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

Чи чули ви про рекурсивні процедури набагато останнім часом? Вони говорять про рекурсивну функцію (справжню функцію) і вона повертає значення, і вони використовують слово "процедура". То яка різниця тоді?

Ну і інший спосіб мислення функції (крім значення, згаданого вище) - це абстрактне зображення ідеалу, як цифра 1. Процедура - це фактичне втілення цієї речі. Я особисто вважаю, що вони взаємозамінні.

(Зверніть увагу, якщо ви читаєте цю главу із посилання, яке я надаю, ви можете виявити, що складніше поняття - це не різниця між функцією та процедурою, а процес і процедура. Чи знаєте ви, що рекурсивна процедура може мати ітераційний процес?)

Аналогом процедур є рецепти. Наприклад; припустимо, у вас є машина, звана make-piesця машина, містить інгредієнти, (fruit, milk, flower, eggs, sugar, heat)і ця машина повертає pie.

Представлення цієї машини може виглядати так

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

Звичайно, це не єдиний спосіб приготувати пиріг.

У цьому випадку ми можемо побачити, що:

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

Ця аналогія нормальна, але вона руйнується, якщо врахувати, що, коли ти маєш справу з комп'ютерною програмою, все це абстракція. Отже, на відміну від рецепту до машини, ми порівнюємо дві речі, які самі по собі є абстракціями; дві речі, які можуть бути однаковими. І я вважаю, що вони (для всіх намірів і цілей) одне і те ж.


2
Функція, яка завжди повертає однакове значення для заданих аргументів, іноді називається "чистою функцією". У більшості мов, які розрізняють процедури і функції, функції не повинні бути чистими, а термін "функція" правильно використовується для позначення підпрограм, які можуть мати побічні ефекти і можуть повертати різні результати при послідовних викликах з однаковими аргументами. (А в мовах подібних С, навіть підпрограми, які не повертають значення, належним чином називаються "функціями".)
Кіт Томпсон

Домовились, саме тому я закінчую словами, що слова є взаємозамінними.
dkinzer

1
Так, але ви починаєте з того, що "Функція - це не просто будь-який старий метод, який повертає значення", тоді як у багатьох мовах це саме те , що є функцією.
Кіт Томпсон

0

У контексті db : Збережена процедура є попередньо складеним планом виконання там, де функцій немає.


0

З точки зору С # / Java, функція - це блок коду, який повертає певне значення, але процедура - це блок коду, який повертає недійсність (нічого). У C # / Java і функції, і процедури частіше називають просто методами .

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }

-3

Процедури: 1. Процедури - це сукупність операторів, яка визначає параметризовані обчислення. 2. Процедури не можуть повернути значення.

3.Процедури не можна викликати з функції.

Функції 1.Функції структурно нагадують процедури, але семантично моделюються на математичних функціях. 2.Можливо повернути значення 3.Функцію можна викликати з процедур.


3.Процедури не можна викликати з функції. Якою мовою це правда? Жодне, що у мене є досвід, не має цього обмеження.
Могсдад

Це правда. Якщо ви викликаєте процедуру з функції, то це не функція. Щодо того, якою мовою це примушує, то це гарне запитання, на яке я не знаю відповіді. Може бути функціональним, але навіть тоді я не впевнений: чистий список функціональний (немає набору: жодна сторона не впливає), але так як у нього є лямбди, то можна встановити набір. Чи можете ви написати компілятор, який не застосовує набір, він повинен виявити всі його реалізації. Ви можете видалити лямбда з мови, але це було б гірше.
ctrl-alt-delor

Ой, я просто подумав про мову C ++: метод const не може викликати метод не const (хоча вам знадобляться правильні перевірки компілятора, а не намагатися його обійти.)
ctrl-alt-delor

-7

Процедури та функції обидві підпрограми. Єдина різниця між ними полягає в тому, що процедура повертає кілька (або принаймні може робити) значень, тоді як функція може повертати лише одне значення (саме тому позначення функції використовуються в математиці, оскільки зазвичай знайдено лише одне значення хоча б деякі мови програмування не дотримуються цих правил, це їх справжнє визначення


Гм, ні. А процедура нічого не робить return. Ви говорите про побічні ефекти, які можливі з обома (якщо це дозволено мовою).
Могсдад

Процедура може повернути будь-яку кількість значень, ця сума може дорівнювати нулю
user2766296

Побічним ефектом було б, якби мав масив і передав його у функцію або процедуру, яка знайшла найбільше значення, масив буде переданий за посиланням, і після того, як підпрограма запустила масив, буде відсортовано, факт, що це сортування - це побічний ефект, повернене значення є найбільшим значенням у масиві
user2766296

Мені подобається ця відповідь, а також мені подобаються такі, що мають кілька посилань, тому що якимось чином має рацію, так, як це не парадоксально, для того, щоб зробити це дуже популярним в SO, я дам йому зворотну оцінку. Збережена процедура на SQL сервері повертає набір результатів (те, що ви назвали "декількома значеннями"), тоді як функція може повернути лише одне значення (що не дуже точно, оскільки ви також можете створити функцію, оцінену у таблиці).
Іванзіньо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.