bc - kézikönyv, opciók, parancspéldák


NÉV

bc - Egy tetszőleges precíziós számológép nyelv

SZINTAXIS

bc [ -hlwsqv ] [long-options] [ file ... ]

LEÍRÁS

A bc egy olyan nyelv, amely tetszőleges precíziós számokat támogat az utasítások interaktív végrehajtásával. A szintaxisban van néhány hasonlóság a C programozási nyelvhez. A szabványos matematikai könyvtár parancssori opcióval érhető el. Ha kérik, a matematikai könyvtár a fájlok feldolgozása előtt meghatározásra kerül. A bc a parancssorban felsorolt összes fájl kódjának feldolgozásával kezdődik a felsorolt sorrendben. Az összes fájl feldolgozása után a bc a szabványos bemenetről olvas. Minden kód végrehajtásra kerül olvasás közben. (Ha egy fájl a processzor leállítására vonatkozó parancsot tartalmazza, a bc soha nem olvas be a szabványos bemenetről.)

A bc ezen verziója számos bővítményt tartalmaz a hagyományos bc megvalósításokon és a POSIX szabványtervezeten túl. A parancssori opciók miatt ezek a bővítmények figyelmeztetést nyomtathatnak vagy elutasíthatják őket. Ez a dokumentum a processzor által elfogadott nyelvet írja le. A bővítményeket ilyenként azonosítjuk.

LEHETŐSÉGEK

-h, --help

Nyomtassa ki a használatot és lépjen ki.

-i, --interactive

Interaktív mód kényszerítése.

-l, --mathlib

Határozza meg a szabványos matematikai könyvtárat.

-w, --warn

Figyelmeztetéseket adjon a POSIX bc bővítményeire.

-s, --standard

Pontosan a POSIX bc nyelvet dolgozza fel.

-q, --quiet

Ne nyomtassa ki a normál GNU bc üdvözlő szöveget.

-v, --version

Nyomtassa ki a verziószámot és a szerzői jogot, majd lépjen ki.

SZÁMOK

A bc legalapvetőbb eleme a szám. A számok tetszőleges pontosságú számok. Ez a pontosság az egész és a tört részben egyaránt érvényesül. Minden szám belsőleg decimálisan van ábrázolva, és minden számítás decimálisan történik. (Ez a verzió csonkolja az osztás és szorzás műveletek eredményeit.) A számoknak két attribútuma van, a hosszúság és a lépték. A hosszúság a bc által egy szám ábrázolására használt tizedesjegyek teljes száma, a skála pedig a tizedesvessző utáni tizedesjegyek teljes száma. Például:

 .000001 has a length of 6 and scale of 6.
 1935.000 has a length of 7 and a scale of 3.

VÁLTOZÓK

A számokat kétféle változóban tároljuk, egyszerű változókban és tömbökben. Mind az egyszerű változókat, mind a tömbváltozókat elnevezzük. A nevek egy betűvel kezdődnek, amelyet tetszőleges számú betű, számjegy és aláhúzás követ. Minden betűnek kisbetűnek kell lennie. (A teljes alfanumerikus nevek egy kiterjesztést jelentenek. A POSIX bc-ben minden név egyetlen kisbetű.) A változó típusa egyértelmű a kontextusból, mert minden tömbváltozó nevét zárójelek követik ( []).

Négy speciális változó létezik: scale, ibase, obase, és last. A skála azt határozza meg, hogy egyes műveletek hogyan használják a tizedesvessző utáni számjegyeket. A skála alapértelmezett értéke 0. Az ibase és az obase határozza meg a bemeneti és kimeneti számok konverziós alapját. Mind a bemenet, mind a kimenet alapértelmezett értéke 10. Az last (kiterjesztés) egy olyan változó, amely az utoljára nyomtatott szám értékével rendelkezik. Ezeket adott esetben részletesebben tárgyaljuk. Ezeknek a változóknak mindegyike értéket rendelhet hozzájuk, és kifejezésekben is használhatók.

HOZZÁSZÓLÁSOK

A bc-ben található megjegyzések a /* karakterekkel kezdődnek, és a */ karakterekkel végződnek. A megjegyzések bárhol kezdődhetnek, és egyetlen szóközként jelenhetnek meg a bevitelben. (Ez azt okozza, hogy a megjegyzések elhatárolják a többi beviteli elemet. Például egy megjegyzés nem található a változónév közepén.) A megjegyzések tartalmazzák a megjegyzés eleje és vége közötti újsorokat (sor vége).

A bc szkriptek használatának támogatása érdekében egy egysoros megjegyzést adtunk hozzá kiterjesztésként. Az egysoros megjegyzés egy # karakterrel kezdődik, és a sor következő végéig tart. A sorvégi karakter nem része a megjegyzésnek, és a szokásos módon kerül feldolgozásra.

KIFEJEZÉSEK

A számokat kifejezések és állítások manipulálják. Mivel a nyelvet interaktívnak tervezték, az utasítások és kifejezések a lehető leghamarabb végrehajtásra kerülnek. Nincs "fő" program. Ehelyett a kód végrehajtása a találkozáskor történik. (A később részletesen tárgyalt funkciókat akkor határozzuk meg, amikor találkozunk.)

Egy egyszerű kifejezés csak konstans. A bc a konstansokat belső decimális számokká alakítja az aktuális bemeneti alap használatával, amelyet az ibase változó határoz meg. (Vannak kivételek a függvények.) Az ibase törvényes értéke 2 és 36 között van. (A 16-nál nagyobb alapok kiterjesztést jelentenek.) Ezen a tartományon kívüli érték hozzárendelése az ibase-hez > értéke 2 vagy 36 lesz. A bevitt számok 0-9 és A-Z karaktereket tartalmazhatnak. (Megjegyzés: nagybetűknek kell lenniük. A kisbetűk változónevek.) Az egyjegyű számok mindig a számjegy értékével rendelkeznek, függetlenül az ibase értékétől. (Azaz A=10.) Többjegyű számok esetén a bc az ibase-nél nagyobb vagy egyenlő bemeneti számjegyeket az ibase-1 értékre módosítja. Ezáltal a ZZZ szám mindig a beviteli alap legnagyobb háromjegyű száma.

A teljes kifejezések sok más magas szintű nyelvhez hasonlóak. Mivel csak egyféle szám létezik, a típusok keverésére nincsenek szabályok. Ehelyett szabályok vonatkoznak a kifejezések skálájára. Minden kifejezésnek van skálája. Ez az eredeti számok skálájából, az elvégzett műveletből és sok esetben a skála változó értékéből adódik. A skála változó törvényes értékei 0-tól a C egész számmal ábrázolható maximális számig.

A jogi kifejezések alábbi leírásában az "expr" egy teljes kifejezésre, a "var" pedig egy egyszerű vagy egy tömbváltozóra utal. Egy egyszerű változó csak a

name

és egy tömbváltozót adunk meg

name[expr]

Hacsak nincs külön említve, az eredmény léptéke az érintett kifejezések maximális skálája.

- expr

Az eredmény a kifejezés tagadása.

++ var

A változó eggyel növekszik, és az új érték a kifejezés eredménye.

-- var

A változó eggyel csökken, és az új érték a kifejezés eredménye.

var ++

A kifejezés eredménye a változó értéke, majd a változót eggyel növeljük.

var --

A kifejezés eredménye a változó értéke, majd a változó eggyel csökken.

expr + expr

A kifejezés eredménye a két kifejezés összege.

expr - expr

A kifejezés eredménye a két kifejezés különbsége.

expr * expr

A kifejezés eredménye a két kifejezés szorzata.

expr / expr

A kifejezés eredménye a két kifejezés hányadosa. Az eredmény skálája a skála változó értéke.

expr % expr

A kifejezés eredménye a "maradék", és a következő módon kerül kiszámításra. Az a%b kiszámításához először az a/b-t skálás számjegyekre számítja ki. Ez az eredmény az a-(a/b)*b kiszámítására szolgál a skála+skála(b) és skála(a) maximumának skálájára. Ha a méretarány nullára van állítva, és mindkét kifejezés egész szám, akkor ez a kifejezés az egész maradék függvény.

expr ^ expr

A kifejezés eredménye az elsőnek a másodikra emelt értéke. A második kifejezésnek egész számnak kell lennie. (Ha a második kifejezés nem egész szám, akkor figyelmeztetés jön létre, és a kifejezést levágja, hogy egész számot kapjon.) Az eredmény skálája skála, ha a kitevő negatív. Ha a kitevő pozitív, az eredmény skálája az első kifejezés skálájának minimuma szorozva a kitevő értékével, valamint a skála és az első kifejezés skálájának maximuma. (pl. skála(a^b)=min(skála(a)*b, max( skála, skála(a))).) Megjegyzendő, hogy az expr^0 mindig az értéket adja vissza 1.

( expr )

Ez megváltoztatja a szabványos elsőbbséget, és kényszeríti a kifejezés kiértékelését.

var = expr

A változóhoz hozzá van rendelve a kifejezés értéke.

var <op>= expr

Ez egyenértékű a "var=var expr" kifejezéssel, azzal az eltéréssel, hogy a "var" rész csak egyszer kerül kiértékelésre. Ez különbséget jelenthet, ha a "var" egy tömb.

A relációs kifejezések a kifejezések egy speciális fajtája, amelyek mindig 0-ra vagy 1-re értékelik, ha a reláció hamis, 0-ra, ha igaz, 1-re. Ezek bármilyen jogi kifejezésben megjelenhetnek. (A POSIX bc megköveteli, hogy a relációs kifejezéseket csak if, while és for utasításokban használjuk, és csak egy relációs tesztet szabad elvégezni bennük.) A relációs operátorok

expr1 < expr2

Az eredmény 1, ha expr1 szigorúan kisebb, mint expr2.

expr1 <= expr2

Az eredmény 1, ha expr1 kisebb vagy egyenlő, mint kif2.

expr1 > expr2

Az eredmény 1, ha expr1 szigorúan nagyobb, mint expr2.

expr1 >= expr2

Az eredmény 1, ha expr1 nagyobb vagy egyenlő, mint expr2.

expr1 == expr2

Az eredmény 1, ha expr1 egyenlő expr2-vel.

expr1 != expr2

Az eredmény 1, ha expr1 nem egyenlő expr2-vel.

A logikai műveletek is legálisak. (A POSIX bc NEM tartalmaz logikai műveleteket). Minden logikai művelet eredménye 0 és 1 (hamis és igaz esetén), mint a relációs kifejezéseknél. A logikai operátorok a következők:

!expr

Az eredmény 1, ha a kifejezés 0.

expr && expr

Az eredmény 1, ha mindkét kifejezés nem nulla.

expr || expr

Az eredmény 1, ha bármelyik kifejezés nem nulla.

A kifejezés elsőbbsége a következő: (a legalacsonyabbtól a legmagasabbig)

|| operator, left associative
&& operator, left associative
! operator, nonassociative
Relational operators, left associative
Assignment operator, right associative
+ and - operators, left associative
*, / and % operators, left associative
^ operator, right associative
unary - operator, nonassociative
++ and -- operators, nonassociative

Ezt az elsőbbséget azért választottuk, hogy a POSIX-kompatibilis bc programok megfelelően fussanak. Ez azt eredményezi, hogy a relációs és logikai operátorok használata szokatlan módon viselkedik, ha hozzárendelési kifejezésekkel használják. Fontolja meg a kifejezést:

a = 3 < 5

A legtöbb C programozó azt feltételezné, hogy ez a "3 < 5" eredményt (az 1 értéket) az "a" változóhoz rendelné. Ez a bc-ben az, hogy a 3-as értéket rendeli az "a" változóhoz, majd összehasonlítja a 3-at 5-tel. A legjobb zárójelet használni, ha relációs és logikai operátorokat használ a hozzárendelési operátorokkal.

A bcben található még néhány speciális kifejezés. Ezek a felhasználó által definiált függvényekhez és a szabványos függvényekhez kapcsolódnak. Mindegyik „név(paraméterek)” néven jelenik meg. A felhasználó által definiált funkciókhoz lásd a funkciókról szóló részt. A szabványos funkciók a következők:

length ( expression )

A hosszfüggvény értéke a kifejezésben lévő jelentős számjegyek száma.

read ( )

Az olvasási funkció (egy kiterjesztés) egy számot olvas be a szabványos bemenetről, függetlenül attól, hogy a funkció hol található. Vigyázat, ez problémákat okozhat az adatok és a program keverésekor a szabványos bemeneten. Ezt a funkciót a legjobban egy korábban megírt programban lehet használni, amelyhez a felhasználótól kell bevinni, de soha nem engedi, hogy a felhasználó programkódot vigyen be. Az olvasási függvény értéke a szabványos bemenetből kiolvasott szám, amely az ibase változó aktuális értékét használja a konverziós alaphoz.

scale ( expression )

A skálafüggvény értéke a kifejezésben a tizedesvessző utáni számjegyek száma.

sqrt ( expression )

Az sqrt függvény értéke a kifejezés négyzetgyöke. Ha a kifejezés negatív, futásidejű hiba keletkezik.

NYILATKOZATOK

Az utasítások (mint a legtöbb algebrai nyelvben) biztosítják a kifejezések kiértékelésének sorrendjét. A bc-ben az utasítások „a lehető leghamarabb” végrehajtásra kerülnek. A végrehajtás akkor történik meg, ha egy újsorral találkozunk, és egy vagy több teljes utasítás van. Ennek az azonnali végrehajtásnak köszönhetően az újsorok nagyon fontosak a bcben. Valójában mind a pontosvesszőt, mind az újsort utasításelválasztóként használják. A nem megfelelően elhelyezett újsor szintaktikai hibát okoz. Mivel az újsorok utasításelválasztók, lehetséges az újsorok elrejtése a fordított perjel karakter használatával. A "\" sorozat, ahol az az újsor, a bc számára szóközként jelenik meg újsor helyett. Az utasításlista olyan utasítások sorozata, amelyek pontosvesszővel és újsorral vannak elválasztva. Az alábbiakban felsoroljuk a bc utasításokat és azt, hogy mit csinálnak: (A zárójelben ([]) szereplő dolgok az utasítás nem kötelező részei.)

expression

Ez a kijelentés két dolog egyikét teszi. Ha a kifejezés a következővel kezdődik: " ...", akkor az hozzárendelési utasításnak minősül. Ha a kifejezés nem hozzárendelési utasítás, akkor a kifejezés kiértékelésre kerül és a kimenetre kerül kinyomtatásra. A szám kinyomtatása után újsor kerül nyomtatásra. Például az „a=1” egy hozzárendelési utasítás, az „(a=1)” pedig egy olyan kifejezés, amely beágyazott hozzárendeléssel rendelkezik. Minden kinyomtatott szám az obase változó által meghatározott alapon kerül kinyomtatásra. Az obase törvényes értéke 2-től BC_BASE_MAX-ig terjed. (Lásd a HATÁROZATOK részt.) A 2-től 16-ig terjedő bázisok esetében a szokásos számírási módszert alkalmazzuk. 16-nál nagyobb bázisok esetén a bc többkarakteres számjegyes módszert használ a számok kinyomtatására, ahol minden magasabb alapjegyet 10-es alapszámként nyomtat. A több karakterből álló számjegyeket szóközzel választjuk el. Minden számjegy annyi karaktert tartalmaz, ahány karakter szükséges az "obase-1" tízes alapértékének megjelenítéséhez. Mivel a számok tetszőleges pontosságúak, előfordulhat, hogy egyes számok nem nyomtathatók egyetlen kimeneti sorra. Ezeket a hosszú számokat a rendszer sorokra osztja, és a „\” karaktert használja a sor utolsó karaktereként. A soronként kinyomtatott karakterek maximális száma 70. A bc interaktív jellege miatt egy szám nyomtatása azt a mellékhatást okozza, hogy a nyomtatott értéket a speciális last változóhoz rendeli. . Ez lehetővé teszi a felhasználó számára, hogy visszaállítsa az utoljára nyomtatott értéket anélkül, hogy újra be kellene írnia a számot kinyomtató kifejezést. Az utolsó értékhez való hozzárendelés törvényes, és az utoljára nyomtatott értéket felülírja a hozzárendelt értékkel. Az újonnan hozzárendelt érték mindaddig megmarad, amíg a következő számot kinyomtatják, vagy más értéket nem rendel az utolsóhoz. (Egyes telepítések lehetővé tehetik egyetlen pont (.) használatát, amely nem része egy számnak az utolsó rövid kézi jelöléseként.)

string

A karakterlánc a kimenetre kerül nyomtatásra. A karakterláncok dupla idézőjellel kezdődnek, és minden karaktert tartalmaznak a következő dupla idézőjel karakterig. Minden karakter szó szerint értendő, beleértve az újsorokat is. A karakterlánc után nem nyomtat újsor karakter.

print list

A print utasítás (kiterjesztés) egy másik kimeneti módszert biztosít. A "lista" a karakterláncok és kifejezések listája, vesszővel elválasztva. Minden karakterlánc vagy kifejezés a lista sorrendjében kerül kinyomtatásra. Lezáró újsor nem kerül nyomtatásra. A rendszer kiértékeli a kifejezéseket, és kinyomtatja értéküket, és hozzárendeli az last változóhoz. A print utasításban szereplő karakterláncok a kimenetre kerülnek, és speciális karaktereket tartalmazhatnak. A speciális karakterek fordított perjellel (\) kezdődnek. A bc által felismert speciális karakterek a következők: "a" (figyelmeztető vagy csengő), "b" (backspace), "f" (lap feed), "n" (újsor), "r" (kocsi return), "q" (idézőjel), "t" (tabulátor) és "\" (fordított perjel). A fordított perjelet követő többi karakter figyelmen kívül marad.

{ statement_list }

Ez az összetett állítás. Lehetővé teszi több utasítás csoportosítását végrehajtáshoz.

if ( expression ) statement1 [else statement2]

Az if utasítás kiértékeli a kifejezést, és a kifejezés értékétől függően végrehajtja az utasítás1 vagy utasítás2 parancsot. Ha a kifejezés nem nulla, akkor az utasítás1 végrehajtásra kerül. Ha az utasítás2 jelen van, és a kifejezés értéke 0, akkor az utasítás2 végrehajtásra kerül. (Az else záradék kiterjesztés.)

while ( expression ) statement

A while utasítás végrehajtja az utasítást, miközben a kifejezés nem nulla. Az utasítás minden végrehajtása előtt kiértékeli a kifejezést. A ciklus befejezését nulla kifejezési érték vagy egy break utasítás végrehajtása okozza.

for ( [expression1] ; [expression2] ; [expression3] ) statement

A for utasítás az utasítás ismételt végrehajtását szabályozza. A kifejezés1 kiértékelése a ciklus előtt történik. A Expression2 kiértékelése az utasítás minden végrehajtása előtt történik. Ha nem nulla, akkor az állítás kiértékelésre kerül. Ha ez nulla, a hurok megszakad. Az utasítás minden végrehajtása után a kifejezés3 kiértékelésre kerül a kifejezés2 újraértékelése előtt. Ha hiányzik az 1. vagy a 3. kifejezés, akkor semmi sem lesz kiértékelve azon a ponton, ahol kiértékelnék. Ha a kifejezés2 hiányzik, az ugyanaz, mintha az 1-es értékkel helyettesítené a kifejezés2-t. (Az opcionális kifejezések kiterjesztés. A POSIX bc mindhárom kifejezést igényli.) A következő egyenértékű kód a for utasításhoz:

expression1;
while (expression2) {
   statement;
   expression3;
}
break

Ez az utasítás kényszerített kilépést okoz a legutóbbi befoglaló while vagy for utasításból.

continue

A folytatási utasítás (egy kiterjesztés) az utasítás legutóbbi bezárásával indítja el a következő iterációt.

halt

A halt utasítás (kiterjesztés) egy olyan végrehajtott utasítás, amely a bc processzort csak a végrehajtáskor állítja ki. Például az "if (0 == 1) halt" nem okozza a bc leállását, mert a leállítás nem kerül végrehajtásra.

return

Egy függvényből a 0 értéket adja vissza. (Lásd a funkciókról szóló részt.)

return ( expression )

Egy függvényből származó kifejezés értékét adja vissza. (Lásd a függvényekről szóló részt.) Kiterjesztésként a zárójel nem szükséges.

ÁLSZUDÓNYILATKOZATOK

Ezek az állítások nem a hagyományos értelemben vett kijelentések. Ezek nem végrehajtott nyilatkozatok. Funkciójukat "összeállítási" időben látják el.

limits

Nyomtassa ki a bc helyi verziója által érvényesített helyi korlátozásokat. Ez egy kiterjesztés.

quit

A quit utasítás beolvasásakor a bc processzor leáll, függetlenül attól, hogy hol található a quit utasítás. Például az "if (0 == 1) kilépés" hatására a bc leáll.

warranty

Nyomtasson ki hosszabb jótállási nyilatkozatot. Ez egy kiterjesztés.

FUNKCIÓK

A függvények egy később végrehajtható számítás meghatározásának módszerét biztosítják. A bc függvényei mindig kiszámítanak egy értéket, és visszaküldik a hívónak. A függvénydefiníciók „dinamikusak” abban az értelemben, hogy a függvény mindaddig definiálatlan, amíg a bemenetben nem találkozunk definícióval. Ezt a definíciót a rendszer addig használja, amíg egy másik definíciós függvényt nem találunk ugyanarra a névre. Az új definíció ezután felváltja a régebbi definíciót. Egy függvény meghatározása a következő:

define name ( parameters ) { newline
    auto_list   statement_list }

A függvényhívás csak a "név(paraméterek)" formájú kifejezés.

A paraméterek számok vagy tömbök (kiterjesztés). A függvénydefinícióban nulla vagy több paramétert a nevük vesszővel elválasztott felsorolásával határozunk meg. Az összes paramétert érték szerinti paraméterek hívják. A tömböket a paraméterdefinícióban a "név[]" jelöléssel határozzuk meg. A függvényhívásban az aktuális paraméterek a számparaméterek teljes kifejezései. A tömbök átadásakor ugyanazt a jelölést használják, mint a tömbparaméterek meghatározásánál. A megnevezett tömb érték szerint kerül átadásra a függvénynek. Mivel a függvénydefiníciók dinamikusak, a paraméterszámok és -típusok ellenőrzésre kerülnek a függvény meghívásakor. A paraméterek számának vagy típusának bármilyen eltérése futásidejű hibát okoz. Futásidejű hiba is előfordul egy meghatározatlan függvény hívásakor.

Az auto_list a „helyi” használatra szánt változók opcionális listája. Az automatikus lista szintaxisa (ha van) "auto name, ... ;". (A pontosvessző nem kötelező.) Minden név egy automatikus változó neve. A tömbök a paramétereknél használt jelöléssel adhatók meg. Ezeknek a változóknak az értékeit egy verembe helyezik a függvény elején. A változókat ezután nullára inicializálják, és a függvény végrehajtása során használják. A függvény kilépésekor ezek a változók előugrik, így ezeknek a változóknak az eredeti értéke (a függvényhívás időpontjában) visszaáll. A paraméterek valójában automatikus változók, amelyek a függvényhívásban megadott értékre inicializálódnak. Az automatikus változók eltérnek a hagyományos helyi változóktól, mivel ha A függvény meghívja a B függvényt, akkor B hozzáférhet az A függvény automatikus változóihoz ugyanazzal a névvel, hacsak B függvény nem nevezte őket auto változóknak. Tekintettel arra, hogy az automatikus változók és paraméterek egy verembe kerülnek, a bc támogatja a rekurzív függvényeket.

A függvénytörzs a bc utasítások listája. Az utasításokat ismét pontosvesszővel vagy újsorral választjuk el. A visszatérési utasítások egy függvény lezárását és egy érték visszatérését okozzák. A return utasításnak két változata létezik. Az első űrlap, a „return”, 0 értéket ad vissza a hívó kifejezésnek. A második űrlap, a "return ( expression )" kiszámítja a kifejezés értékét, és visszaadja ezt az értéket a hívó kifejezésnek. Minden függvény végén van egy hallgatólagos "return (0)". Ez lehetővé teszi egy függvény számára, hogy kifejezett return utasítás nélkül fejezze be és adja vissza a 0-t.

A függvények megváltoztatják az ibase változó használatát is. A függvénytörzsben lévő összes konstans az ibase értékével lesz konvertálva a függvényhívás időpontjában. Az ibase változásait a rendszer figyelmen kívül hagyja a függvény végrehajtása során, kivéve a normál read függvényt, amely mindig az ibase aktuális értékét használja számok átalakítása.

Számos kiterjesztés került a funkciókhoz. Először is, a meghatározás formátuma kissé lazább lett. A szabvány előírja, hogy a nyitó kapcsos zárójel ugyanabban a sorban legyen, mint a define kulcsszó, és az összes többi résznek a következő sorokban kell lennie. A bc ezen verziója tetszőleges számú újsort engedélyez a függvény nyitó kapcsos zárójele előtt és után. Például a következő meghatározások legálisak.

define d (n) { return (2*n); }
define d (n)
  { return (2*n); }

A függvények érvénytelenként definiálhatók. A void függvény nem ad vissza értéket, ezért nem használható olyan helyen, ahol értékre van szükség. A void függvény nem ad ki semmilyen kimenetet, ha magától meghívódik egy bemeneti vonalon. A void kulcsszó a define kulcsszó és a függvény neve közé kerül. Vegyük például a következő munkamenetet.

define py (y) { print "--->", y, "<---", "\n"; }
define void px (x) { print "--->", x, "<---", "\n"; }
py(1)
--->1<---
0
px(1)
--->1<---

Mivel a py nem érvénytelen függvény, a py(1) meghívása kiírja a kívánt kimenetet, majd kiír egy második sort, amely a függvény értéke. Mivel egy olyan függvény értéke, amely nem kapott explicit return utasítást, nulla, a nulla kerül kinyomtatásra. A px(1) esetén a rendszer nem nyomtat nullát, mert a függvény érvénytelen függvény.

Ezenkívül hozzáadásra került a tömbök változó általi hívása. A hívás változótömb szerinti deklarálásához a tömbparaméter deklarációja a függvénydefinícióban így néz ki: „*név[]”. A függvény hívása ugyanaz marad, mint az érték szerinti tömbök hívása.

MATH KÖNYVTÁR

Ha a bc függvényt a -l opcióval hívják meg, akkor a rendszer előre betölt egy matematikai könyvtárat, és az alapértelmezett skála 20-ra van állítva. A matematikai függvények az eredményüket a beállított skála szerint számítják ki. hívásuk ideje. A matematikai könyvtár a következő függvényeket határozza meg:

s (x)

Az x, x szinusza radiánban van.

c (x)

Az x, x koszinusza radiánban van.

a (x)

Az x arctangense radiánokat ad vissza.

l (x)

x természetes logaritmusa.

e (x)

Az e-t x értékre emelésének exponenciális függvénye.

j (n,x)

Az x n egész rendű Bessel-függvénye.

PÉLDÁK

A /bin/sh fájlban a következők a "pi" értékét rendelik a pi shell változóhoz.

pi=$(echo "scale=10; 4*a(1)" | bc -l)

A következő a matematikai könyvtárban használt exponenciális függvény definíciója. Ez a függvény POSIX bc nyelven íródott.

scale = 20

/* Uses the fact that e^x = (e^(x/2))^2
   When x is small enough, we use the series:
     e^x = 1 + x + x^2/2! + x^3/3! + ...
*/

define e(x) {
  auto  a, d, e, f, i, m, v, z

  /* Check the sign of x. */
  if (x<0) {
    m = 1
    x = -x
  } 

  /* Precondition x. */
  z = scale;
  scale = 4 + z + .44*x;
  while (x > 1) {
    f += 1;
    x /= 2;
  }

  /* Initialize the variables. */
  v = 1+x
  a = x
  d = 1

  for (i=2; 1; i++) {
    e = (a *= x) / (d *= i)
    if (e == 0) {
      if (f>0) while (f--)  v = v*v;
      scale = z
      if (m) return (1/v);
      return (v/1);
    }
    v += e
  }
}

A következő kód a bc kiterjesztett szolgáltatásait használja egy egyszerű program megvalósításához a csekkfüzet egyenlegének kiszámításához. Ezt a programot a legjobb fájlban tárolni, így sokszor használható anélkül, hogy minden használatnál újra be kellene gépelni.

scale=2
print "\nCheck book program!\n"
print "  Remember, deposits are negative transactions.\n"
print "  Exit by a 0 transaction.\n\n"

print "Initial balance? "; bal = read()
bal /= 1
print "\n"
while (1) {
  "current balance = "; bal
  "transaction? "; trans = read()
  if (trans == 0) break;
  bal -= trans
  bal /= 1
}
quit

A következő a rekurzív faktoriális függvény definíciója.

define f (x) {
  if (x <= 1) return (1);
  return (f(x-1) * x);
}

READLINE ÉS LIBEDIT OPCIÓK

A GNU bc lefordítható (a konfigurációs opcióval) a GNU readline bemeneti szerkesztő könyvtárának vagy a BSD libedit könyvtárának használatára. Ez lehetővé teszi a felhasználó számára a sorok szerkesztését, mielőtt elküldené őket a bc-nek. Lehetővé teszi a korábban beírt sorok történetét is. Ha ez a lehetőség ki van választva, a bc egy további speciális változóval rendelkezik. Ez a speciális változó, a history a megőrzött előzménysorok száma. Readline esetén a -1 érték azt jelenti, hogy korlátlan számú előzménysor megmarad. Ha az előzmények értékét pozitív számra állítja, az előzménysorok számát a megadott számra korlátozza. A 0 érték letiltja az előzmények funkciót. Az alapértelmezett érték 100. További információkért olvassa el a GNU readline, history és BSD libedit könyvtárak felhasználói kézikönyvét. A readline és a libedit egyszerre nem engedélyezhető.

KÜLÖNBSÉGEK

A bc ezen verzióját a POSIX P1003.2/D11 tervezetből valósították meg, és számos eltérést és bővítést tartalmaz a vázlathoz és a hagyományos megvalósításokhoz képest. Nem a hagyományos módon, a dc(1) használatával valósítják meg. Ez a verzió egyetlen folyamat, amely elemzi és lefuttatja a program bájtos kódfordítását. Van egy "undocumented" opció (-c), ami miatt a program a bájtkódot a szabványos kimenetre adja ki, ahelyett, hogy futtatná. Főleg az elemző hibakeresésére és a matematikai könyvtár előkészítésére használták.

A különbségek egyik fő forrása a bővítmények, ahol egy funkciót további funkciók és kiegészítések hozzáadásával bővítenek, ahol új funkciókat adnak hozzá. Az alábbiakban felsoroljuk a különbségeket és a kiterjesztéseket.

LANG environment

Ez a verzió nem felel meg a POSIX szabványnak a LANG környezeti változó és az LC_ kezdetű környezeti változók feldolgozása során.

names

A hagyományos és a POSIX bc egybetűs nevekkel rendelkezik a függvények, változók és tömbök számára. Kibővítették őket több karakterből álló nevekre, amelyek betűvel kezdődnek, és tartalmazhatnak betűket, számokat és aláhúzásjelet.

Strings

A karakterláncok nem tartalmazhatnak NUL karaktert. A POSIX szerint minden karakternek szerepelnie kell a karakterláncokban.

last

A POSIX bc-nek nincs last változója. A bc egyes megvalósításai hasonló módon használják a (.) pontot.

comparisons

A POSIX bc csak az if utasításban, a while utasításban és a for utasítás második kifejezésében teszi lehetővé az összehasonlítást. Ezenkívül minden utasításban csak egy relációs művelet megengedett.

if statement, else clause

A POSIX bc-nek nincs else záradéka.

for statement

A POSIX bc megköveteli, hogy minden kifejezés jelen legyen a for utasításban.

&&, ||, !

A POSIX bc nem rendelkezik logikai operátorokkal.

read function

A POSIX bc nem rendelkezik olvasási funkcióval.

print statement

A POSIX bc nem rendelkezik nyomtatási utasítással .

continue statement

A POSIX bc-nek nincs folytatása utasítás.

return statement

A POSIX bc zárójeleket igényel a visszatérési kifejezés körül.

array parameters

A POSIX bc (jelenleg) nem támogatja teljes mértékben a tömbparamétereket. A POSIX nyelvtan lehetővé teszi a tömbök használatát a függvénydefiníciókban, de nem ad módszert egy tömb tényleges paraméterként történő megadására. (Ez nagy valószínűséggel nyelvtan hiányossága.) A bc hagyományos megvalósításaiban csak érték szerinti tömbparaméterek vannak.

function format

A POSIX bc megköveteli a nyitó kapcsos zárójelet ugyanabban a sorban, mint a define kulcsszót, és az auto utasítást a következő sorban.

=+, =-, =*, =/, =%, =^

A POSIX bc nem igényli ezeket a "régi stílusú" hozzárendelési operátorokat. Ez a verzió lehetővé teheti ezeket a "régi stílusú" hozzárendeléseket. A limits utasítás segítségével ellenőrizze, hogy a telepített verzió támogatja-e ezeket. Ha támogatja a "régi stílusú" hozzárendelési operátorokat, az "a =- 1" utasítás 1-gyel csökkenti az a-t ahelyett, hogy az a-t -1-re állítaná.

spaces in numbers

A bc egyéb megvalósításai lehetővé teszik a szóköz használatát a számokban. Például az "x=1 3" 13 értéket rendel az x változóhoz. Ugyanez az utasítás szintaktikai hibát okozna a bc ezen verziójában.

errors and execution

Ez a megvalósítás abban különbözik a többi megvalósítástól, hogy milyen kód kerül végrehajtásra, amikor szintaktikai és egyéb hibákat talál a programban. Ha szintaktikai hibát talál egy függvénydefinícióban, a hibahelyreállítás megpróbálja megtalálni az utasítás elejét, és folytatja a függvény elemzését. Amint szintaktikai hibát talál a függvényben, a függvény nem lesz hívható, és meghatározatlanná válik. Az interaktív végrehajtási kódban lévő szintaktikai hibák érvénytelenítik az aktuális végrehajtási blokkot. A végrehajtási blokkot egy sorvég zárja le, amely egy teljes utasítássorozat után jelenik meg. Például,

a = 1
b = 2

két végrehajtási blokkkal és

{ a = 1
  b = 2 }

egy végrehajtási blokkal rendelkezik. Bármilyen futásidejű hiba leállítja az aktuális végrehajtási blokk végrehajtását. A futásidejű figyelmeztetés nem szakítja meg az aktuális végrehajtási blokkot.

Interrupts

Egy interaktív munkamenet során a SIGINT jel (amelyet általában a terminál vezérlő-C karaktere generál) az aktuális végrehajtási blokk végrehajtásának megszakítását okozza. Egy "futásidejű" hibaüzenet jelenik meg, jelezve, hogy melyik funkció szakadt meg. Az összes futásidejű struktúra megtisztítása után a rendszer egy üzenetet nyomtat, amely értesíti a felhasználót, hogy a bc készen áll a további bevitelre. Minden korábban meghatározott függvény definiált marad, és az összes nem automatikus változó értéke a megszakítási pont értéke. A tisztítási folyamat során minden automatikus változó és funkcióparaméter eltávolításra kerül. Egy nem interaktív munkamenet során a SIGINT jel leállítja a bc teljes futtatását.

KORLÁTOZÁSOK

Az alábbiak a jelenleg érvényben lévő korlátozások erre a bc processzorra. Lehet, hogy néhányat a telepítés megváltoztatott. Használja a limits utasítást a tényleges értékek megtekintéséhez.

BC_BASE_MAX

A maximális kimeneti bázis jelenleg 999. A maximális bemeneti bázis 16.

BC_DIM_MAX

Ez jelenleg egy tetszőleges 65535-ös korlát. A telepítés eltérő lehet.

BC_SCALE_MAX

A tizedesvessző utáni számjegyek száma legfeljebb INT_MAX számjegy lehet. Ezenkívül a tizedesvessző előtti számjegyek száma INT_MAX számjegyre van korlátozva.

BC_STRING_MAX

A karakterláncban lévő karakterek számának korlátja INT_MAX karakter.

exponent

A kitevő értéke az emelési műveletben (^) LONG_MAX-ra van korlátozva.

variable names

Az egyedi nevek számának jelenlegi korlátja 32767 egyszerű változók, tömbök és függvények esetén.

KÖRNYEZETI VÁLTOZÓK

A következő környezeti változókat dolgozza fel a bc:

POSIXLY_CORRECT

Ez ugyanaz, mint a -s opció.

BC_ENV_ARGS

Ez egy másik mechanizmus az érveknek a bchez való eljuttatására. A formátum megegyezik a parancssori argumentumokkal. Először ezeket az argumentumokat dolgozza fel a rendszer, tehát a környezeti argumentumokban felsorolt fájlokat a rendszer a parancssori argumentumfájlok előtt dolgozza fel. Ez lehetővé teszi a felhasználó számára, hogy „szabványos” beállításokat és fájlokat állítson be a bc minden egyes meghívásakor. A környezeti változókban lévő fájlok jellemzően olyan függvénydefiníciókat tartalmaznak, amelyeket a felhasználó a bc minden egyes futtatásakor meg kíván határozni.

BC_LINE_LENGTH

Ennek egy egész számnak kell lennie, amely megadja a karakterek számát a számok kimeneti sorában. Ez magában foglalja a fordított perjelet és az újsor karaktereket a hosszú számoknál. Kiterjesztésként a nulla érték letiltja a többsoros szolgáltatást. A változó bármely más értéke, amely kisebb, mint 3, a sor hosszát 70-re állítja.

DIAGNOSZTIKA

Ha a parancssorban lévő fájlokat nem lehet megnyitni, a bc jelzi, hogy a fájl nem érhető el, és leáll. Ezenkívül vannak fordítási és futási idejű diagnosztikai adatok, amelyeknek magától értetődőnek kell lenniük.

BUGS

A hibaelhárítás még nem túl jó.

A hibajelentéseket e-mailben küldje el a bug-bc@gnu.org címre. Ügyeljen arra, hogy a ``bc'' szót valahol a ``Tárgy:'' mezőben szerepeltesse.

SZERZŐ

Philip A. Nelson
philnelson@acm.org

KÖSZÖNETNYILVÁNÍTÁS

A szerző köszönetet mond Steve Sommarsnak (Steve.Sommars@att.com) a megvalósítás tesztelésében nyújtott széleskörű segítségéért. Sok nagyszerű javaslat hangzott el. Ez sokkal jobb termék az ő részvétele miatt.