Кондиционал (рачунарско програмирање)![]() ![]() У информатици, условне изјаве, условни изрази и условне конструкције су функције програмског језика, које извршавају различита израчунавања или различите акције у зависности од тога да ли је програмерски одређен булов услов оценио на тачно или нетачно. Осим у случају предвиђања огранка, ово се увек постиже тако што се селективно мења управљање током засновано на неком услову. У језицима императивног програмирања, термин "условна изјава" се обично користи, док у функционалном програмирању, термини "условни изрази" или "условна конструкција" су пожељни, зато што ови појмови имају различита значења. Иако динамична депеша обично није класифицирана као условна конструкција, она представља још један начин бирања између алтернатива за време рантајма. If–then(–else)
If (boolean condition) Then
(consequent)
Else
(alternative)
End If
Када интерпретарор пронађе реч После извршавања било које гране, управљање током се враће на тренутак после У првим програмским језицима, посебно неки дијалекти Бејсика у кућним рачунарима 1980-их година, Субтилност је у томе да опционална else клаузула која се може њаћи у многим језицима значи да је контекстно слободна граматика двосмислена, пошто се груписани кондиционали могу анализирати на различите начине. Конкретно, if a then if b then s else s2 се може анализирати као if a then (if b then s) else s2 или if a then (if b then s else s2) у зависности да ли је Else ifКоришћењем if услов then
--изјаве
elseif услов then
-- још изјава
elseif услов then
-- још изајва;
...
else
-- друге изјаве;
end if;
Међутим, у многим језицима који воде директно порекло од Алгола, као што су Алгол68, Симула, Паскал, BCPL и C, ова специјална синтакса за Овај дизајнерски избор има малу "цену" у томе да код Ако сви термини у секвенци кондиционала тестирају вредност једног израза (нпр, If-then-else изразимноги језици подржавају if изразе, који су слични if изјавама, али враћају вредност као резултат. Стога, они су истински изрази (који процењују на вредност), не изјаве (које мењају стање програма или врше неку врсту акције). Алгол породицаАлгол 60 и неки други чланови Алгол породице дозвољавају мојапроменљива := if x > 10 then 1 else 2 Lisp дијалектиУ дијалектима Lisp-а -- Ским, Ракет и Common Lisp -- од којих је прва била инспирисана у великој мери од стране Алгола: ;; Scheme
(define myvariable (if (> x 10) 1 2)) ; Додељује ‘myvariable’ на 1 или 2, у зависности од вредности ‘x’
;; Common Lisp
(let ((x 5))
(setq myvariable (if (> x 10) 1 2))) ; Додељује ‘myvariable’ на 2
ХасклУ Хаскл 98, постоји само if израз, а не if изјава, и Зато што је Хаскл лењ, могуће је писати контролне структуре, као што су if, као обичне изразе; лења евалуација значи да if функција може да процени само услов и одговарајућу грану (где би строги језик процењивао сва три). Може се написати овако:[3] if' :: Bool -> a -> a -> a
if' True x _ = x
if' False _ y = y
Језици налик на CC и језици налик на C имају специјалан тернарни оператер (?:) за кондиционалне изразе са функцијом која може бити описана од стране шаблона на овај начин:
Ово значи да може бити убачен у изразе, за разлику од if-изјава, у језицима налик на C: моја_променљива = (x > 10) ? "foo" : "bar"; // У језицима налик на C
који могу бити поређени са if-then-else изразима Алгол породице (и слично у Руби и Скали, међу осталима). Да би постигли исту ствар користећи if-изјаву, за ово би било потребно више од једне линије кода (под типочним конвенцијама израза): if (x > 10)
моја_променљива = 'foo';
else
моја_променљива = 'bar';
Неки тврде да је изричита if/then изјава лакша за читање и да се може саставити на ефикаснији код од тернарног оператера,[4] док други тврде да су концизни изрази лакши за читање него изјаве прострањене на неколико линија. Унутар Вижуал бејсикаУ Вижуал бејсику и неким другим језицима, функција која се назива Аритметичко ifДо Фортрана 77, језик Фортаран има "аритметичку if" изјаву која је на пола пута између обрачунатог IF и изјаве случаја, базирану на трихотомији , , . Ово је најранија условна изјава у фортрану:[5] IF (e) ознака1, ознака2, ознака3
Где је e било који нумерички израз (не мора бити цео број); ово је еквивалентно са IF (e .LT. 0) GOTO ознака1
IF (e .EQ. 0) GOTO ознака2
GOTO ознака3
Зато што је ово аритметичко IF еквивалентоно вишеструким Ово је била једина условна контролна изјава у оригиналној имплементацији Фортрана на IBM 704 рачунару. На том рачунару је тест-и-грана op-код имао три адресе за за та три стања. Други рачунари би имали "застава" регистре као што су позитива, нула, негатива, једнакост, преливање, ношење, повезане са последњом аритметичком операцијом и они би користили инструкција као што су 'Разгранај ако је акумулатор негативан' затим 'Разгранај ако је аумулатор нула' или слично. Имајте на уму да се израз процењује само једном, и у случајевима као што је цео аритметички број где може доћи до преливања, такође би се разматрало преливање или ношење застава . Објектно-оријентисана имплементација у SmalltalkуЗа разлику од других језика, у Smalltalkу условна изјава није језичка конструкција али је дефинисана у класи var = condition
ifTrue: [ 'foo' ]
ifFalse: [ 'bar' ]
Изјаве случаја и заменеИзјаве замене (у неким језицима, изјаве случаја или гране на више начина) упоређују дату вредност са специфизираном константом и предузимају мере према првој константи која одговара. Обично постоји одредба за подразумевану акцију ('else','otherwise') коју треба предузети ако ниједно спаривање не успе. Изјаве замене могу дозволити компајлер оптимизације, као што су лукап табеле. у динамичким језицима, случајеви можда неће бити ограничени на сталне изразе, и можда се прошире на подударање шаблона, као у шел скрипт примеру са десне стране, где '*)' имплементира уобичајен случај за регуларни израз који се подудара са сваким стрингом.
Уклапање шаблонаУклапање шаблона се можда види као софистициранија алтернатива и за if-then-else изјаве и изјаве случаја. Она је доступна у многим програмским језицима са функционалним програмским карактеристикама, као што су Волфрам језик, ML и многи други. Ево простог примера написаног у OCaml језику: match fruit with
| "apple" -> cook pie
| "coconut" -> cook dango_mochi
| "banana" -> mix;;
Моћ укапања шаблона је способност да концизно слаже не само акције али и вредности у обрасце података. Ево примера написаног у Хаскл који илуструје обе ове карактеристике: map _ [] = []
map f (h : t) = f h : map f t
Овај код дефинише мапу, функције која примењује први аргумент (функцију) сваком од елемената другог аргумента (листе), и враће резултујућу листу. Две линије су две дефиниције функције за две врсте аргумената могућих у овом случају – онај у коме је листа празна (само врати празну листу) и други случај када листа ниеј празна. Уклапање шаблона стриктно говорећи није увек изборна конструкција, зато што је могуће у Хасклу написати само једну алтернативу, која је загарантована да увек пуде упарена – у овој ситуацији, се не користи као изборна конструкција, већ само као начина везивања имена са вредностима. Међутим, често се користи као изборна конструкција у језицима у којима је доступна. Кондиционали базирани на хешуУ пограмским језицима који имају асоцијативне низове или упоредиве структуре, као што су Пајтон, Перл, PHP или Objective-C, идиоматски је да их користите за имплементацију условног задатка.[7] љубимац = raw_input("Унесите тип љубимца којег желите да именујете: ")
познати_љубимци = {"Пас": "Fido",
"Мачка": "Meowsles",
"Птица": "Tweety"}
моје_име = познати_љубимци[љубимац]
У динамичким језицима који имају анонимне функције или које дозвољавају програмеру да додели именовану функцију варијаблној референци, условни ток се може имплементирати коришћењем хеша као прескок стола. Предвиђање огранакаУ асемблерским језицима, предвиђање огранака је функција одређених процесорских (централних процесорских јединица) (CPU) комплета инструкција која дозвољава суловно извршавање инструкција, без потребе да се извршавају скупи условни скокови. Упућивање изброног системаОва табела се односи на велики број недавних језичких спецификација за сваки језик. За језике који немају спецификацију, последња званично пуштена имплементација је она на коју се односи.
Види јошРеференце
Спољашње везе
|
Portal di Ensiklopedia Dunia