Estä (ohjelmointi)

Lohko (kutsutaan myös koodilohkoksi , komentolohkoksi , käskylohkoksi ) ohjelmoinnissa on loogisesti ryhmitelty joukko peräkkäisiä ohjeita ohjelman lähdekoodissa , ja se on strukturoidun ohjelmoinnin paradigman perusta .

Lohkot rajoittavat muuttujien ja funktioiden laajuutta ja mahdollistavat myös ohjelohkon käytön yhtenä käskynä, ne voivat olla tyhjiä tai sisäkkäisiä.

Koodilohkoa verrataan joskus tekstikappaleeseen, vaikka näillä käsitteillä on merkittäviä eroja.

Toisaalta lohko on äärimmäisen yksinkertainen ohjelmointikonsepti, toisaalta joissakin ohjelmointikielissä, esimerkiksi JavaScriptissä , se liittyy suureen määrään hienovaraisia ​​erityispiirteitä, mikä toisinaan vaikeuttaa sen toimintaa.

Estä valinta

Lohkojen valitsemiseen käytetään erityisiä ohjelmointikielirakenteita. Esimerkiksi C :n kaltaisessa kieliperheessä ( C , C++ , Java ) ja JavaScriptissä käytetään kiharoita ( «{»ja «}»). ALGOL - pohjaiset kielet käyttävät avainsanoja beginja end( operaattorisulut ). Lisp - pohjaisissa kielissä käytetään S-lausekkeita ( lambdajne let.) Pythonissa lohkot määritellään eroilla koodirivien sisennyksissä rivin alun vasemmasta reunasta (yleensä 4 välilyöntiä).

Laajuus

Monilla kielillä lohkoja käytetään rajoittamaan laajuutta. Joten esimerkiksi ilohkon sisällä ilmoitettu muuttuja on "näkyvä" kyseisessä lohkossa (mukaan lukien sisäkkäiset lohkot), mutta ei "näkyvä" sen ulkopuolella, joten yleisesti käytettyä tunnistetta ivoidaan käyttää monissa paikoissa ohjelmassa. aiheuttamatta virheitä. Sama koskee menettelyjen, funktioiden nimiä, joillain kielillä - luokkia.

Joillakin kielillä estoalueella on melko ei-triviaali käyttäytyminen. Esimerkiksi JavaScript -kielessä sen toiminta riippuu useista olosuhteista.

Ominaisuudet

Smalltalk -perheen kielillä lohkot ovat objekteja , joilla on kaikki vastaavat ominaisuudet.

JavaScriptissä lohkon syntaksi on samanlainen kuin objektiliteraalin syntaksi, ja näiden rakenteiden semantiikka määräytyy lausekkeeseen kuuluvan ulkoisen kontekstin mukaan, koska erityisesti algoritmi semantiikan määrittämiseksi sisäisen kontekstin perusteella kohtaavat ratkaisemattomia epäselvyyksiä. Lisäksi siinä ohje breakei näe tunnisteita sen toiminnon ulkopuolella, jossa sitä suoraan käytetään, mikä voi toimia vahvana argumenttina do-lausekkeiden toteuttamisen puolesta JavaScriptissä .

Esimerkkejä

Estä funktion sisällä C -kielellä :

{ int a = 1 ; int b = 2 ; int c = a + b ; paluu c ; }

Block Pascal -kielellä :

aloita a := 5 ; b := a - 2 ; loppu

Estäesimerkki Transact-SQL :ssä:

ALKAA SET @a = 'f' JOS @b = 1 SET @a = @a + ',f' MUUTA JOS @b = 2 SET @a = @a + ',e' LOPPU

JavaScript - lohko ilman tunnistetta:

{ const a = 1 , b = 2 , c = a + b ; }

Tyhjä nimeämätön lohko, joka on sisäkkäinen nimeämättömien JavaScript -lohkojen joukossa :

{{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}}}}}}} }}} }}}}}

Esittely yhdestä JavaScript - lohkon laajuusominaisuuksista :

{ olkoon a = 1 ; var b = 2 ; konsoli . loki ( b ) // 2 konsoli . loki ( a ) // 1 } konsoli . loki ( b ) // 2 konsoli . loki ( a ) //ReferenceError!

Huolimatta edellisessä esimerkissä esitetystä ominaisuudesta, seuraava JavaScript -koodiesimerkki johtaa syntaksivirheeseen.

{ olkoon a = 1 ; var a = 1 ; }

JavaScriptin lohko, jossa on tunniste ja joka keskeyttää sen suorituksen käskyllä break​​omassa tunnisteessaan (huomaa, että tunnisteen ja samannimisen tunnisteen välillä ei ole ristiriitaa):

x : { const x = 0 ; konsoli . loki ( x ); tauko x ; konsoli . loki ( x ); }

Erilainen semantiikka JavaScript{...} - kielessä (virheellistä sisältöä käytetään osoittamaan semantiikan määritelmää ulkoisen kontekstin mukaan):

// Koodilohko { _ : 1 , _ : 2 , } + []; // Syntaksivirhe! // Koodilohkon eval ( '{ _: 1, _: 2, }' ) // SyntaxError! eval ( '{ valueOf: _ => Math.random() }' ) /*Sisäisen kontekstin semantiikan algoritmin ratkaisematon epäselvyys*/ // Objektikirjaimellinen eval ( '({ _: 1, _: 2, })' ) eval ( '+{ valueOf: _ => Math.random() }' ) // Osa nuolifunktion syntaksia (() => { _ : 1 , _ : 2 , })() // SyntaxError! // Objektiteraali (() => ({ _ : 1 , _ : 2 , }))()

JavaScriptbreak - kielen ohjeiden "sokeuden" osoitus :

x : { konsoli . loki ( 1 ); (() => { break x ; // Syntaksivirhe! })(); konsoli . tukki ( 2 ); }