bc(1) | General Commands Manual | bc(1) |
NÉV¶
bc - Lebegőpontos kalkulátor nyelvÁTTEKINTÉS¶
bc [ -lws ] [ fájl ... ]VERZIÓ¶
Ez a kézikönyv lap a GNU bc 1.03-as verzióját írja le.LEÍRÁS¶
bc egy olyan nyelv, amely lebegőpontos számolást nyújt, interaktív végrehajtással. Van némi hasonlóság a C programozási nyelvvel. Egy standard matematikai könyvtár megadható parancssor paraméterként. Ha szükséges, a matematikai könyvtárat definiálni kell, mielőtt bármilyen más fájlt feldolgoznánk. A bc a megadott fájlokban levő kódot a megadás sorrenjében dolgozza fel. Miután minden fájlt feldolgozott a bc a szabványos bemenetről vár további utasításokat. Minden kódot a beolvasás pillanatában végrehajt. (Ha egy fájlban olyan utasítás található, amely megállítja a feldolgozót, a bc nem fog a szabványos bemenetről olvasni.A bc ezen implementációja sok bővítéssel rendelkezik a POSIX standardhoz képest. Parancssor opcióval megadható, hogy a program ezeknél figyelmeztessen, vagy dobja vissza őket. Ez a dokumentum az ezen feldolgozó által elfogadott nyelvet írja le. A kiterjesztések természetesen jelölésre kerülnek.
OPCIÓK¶
- -l
- Definiálja a standard matematikai könyvtárat.
- -w
- Figyelmeztet a POSIX bc-hez képest használt kiterjesztésekre.
- -s
- Csak a pontos POSIX bc nyelvet dolgozza fel.
SZÁMOK¶
A bc legalapvetőbb eleme a szám. A számok pontossága bármekkora lehet. Ez a pontosság mind az egész, mind a tört részre vonatkozik. Minden szám belsőleg decimálisan tárolódik, és a számítások is decimálisan hajtódnak végre. (Ez a verzió az osztásnál és a szorzásnál csonkít.) A számoknak két jellemzője van, a hossz és a lépték. A hossz a szignifikáns decimális számjegyek számát jelenti, a lépték pedig a tizedspont után levőkét. Például:.000001 számnak a hossza és a léptéke is 6. míg az 1935.000 számnak a hossza 7, a léptéke 3.
VÁLTOZÓK¶
A számokat két fajta változóban lehet tárolni, egyszerű változóban vagy tömbben. Mind az egyszerű, mind a tömbváltozónak van neve. A neveknek betűvel kell kezdődniük, ezt követhetik számok, betűk vagy aláhúzások. Minden betűnek kisbetűnek kell lennie. (A teljes alfanumerikus nevek már egy kiterjesztés. A POSIX bc-ben minden név egy kisbetűből áll.) A változó típusa a kontextusból tisztán kiderül, mivel minden tömb változót egy szögletes zárójel pár ([]) követ.Négy speciális változó van, scale, ibase, obase, és last. A scale azt definiálja, hogy néhány művelet a tizdes pont után hány számjegyet használjon. A scale alapértelmezett értéke 0. Az ibase és az obase definiálja a bemeneti és a kimeneti számrendszer konverziót. Az alapértelmezett számrendszer mind a bemenetre, mind a kimenetre 10-es. A last (kiterjesztés) változóban az utolsó kiírt érték szerepel. Ez később kerül részletezésre. Ezeknek vátlozóknak lehet értéket adni, de kifejezésben is használhatóak.
MEGJEGYZÉS¶
A megjegyzések a bc-ben a /* karakterekkel kezdődnek és a */ karakterek jelzik a végét. A megjegyzések bárhol megjelenhetnek, és a bemenetben egy szóközt jelentenek. (Ez azt jelenti, hogy a megjegyzések elhatárolnak más objektumokat. Például, egy megjegyzés nem lehet egy változónév közepén.) A megjegyzésekben bármennyi újsor lehet (sor vége), a megjegyzés kezdete és vége között.KIFEJEZÉSEK¶
A számokat kifejezésekkel és utasításokkal lehet manipulálni. Mivel a nyelvet interaktívra készítették, az utasítások és a kifejezések rögtön végrehajtódnak. Nincs "fő" program (main függvény). A kód olyan sorrendben hajtódik végre, ahogy a bc beolvassa. (A függvények, később kerülnek leírásra, a beolvasás sorrendjében kerülnek definiálásra.)Egy egyszerű kifejezés egy konstans. A bc a konstanst az ibase változóban megadott bemeneti számrendszer szerint decimális számmá konvertálja. (Kivétel a függvényeknél.) Az ibase érvényes értékei 2-től 16-ig terjednek. Ezen a határon túli értéket megadva az ibase változónak, a változó értéke 2 vagy 16 lesz. A bemenő számok a 0-9-ig és az A-F-ig terjedő karaktereket tartalmazhatják. (Megjegyzés: Nagybetűknek kell lenniük. A kisbetűk a változóknak vannak fenntartva.) Az egy számjegyű számoknak mindig a számjegy az értéke, az ibase változótól függetlenül (pl.: A = 10). A több számjegyű számoknál a bc az ibase-nél nagyobb számjegyeket bc - 1-re cseréli. Ezáltal, a FFF mindig a lehetó legnagyobb háromjegyű számot jelenti.
A teljes kifejezések hasonlóak a többi magas szintű nyelvben levőkhöz. Mivel csak egyetlen típusú szám van, nincs szabály a típusok keverésének kezelésére. Minden kifejezésnek van egy pontossága. Ez az eredeti számokból, az elvégzett műveletekból és még sok egyébből tevődik össze, az értéke a scale változóban található. Ezen változó legális értékei a 0-tól a C nyelvben egész számnak megadható legnagyobb értékig terjednek.
Itt következik a legalis kifejezések leírása, az "expr" a teljes kifejezésre, a "var" pedig egy egyszerű, vagy egy tömb változóra vonatkozik. Egy egyszerű változóra a
- - expr
- Az eredmény a kifejezés negáltja.
- ++ var
- A változó értéke eggyel nő, és az eredmény a változó új értéke lesz.
- -- var
- A változó értéke eggyel csökken, és az eredmény a változó új értéke lesz.
- var ++
- A kifejezés eredménye a változó eredeti értéke, majd a változó értéke nő eggyel.
- var --
- A kifejezés eredménye a változó eredeti értéke, majd a változó értéke csökken eggyel.
- expr + expr
- Az eredmény a két kifejezés összege.
- expr - expr
- Az eredmény a két kifejezés különbsége.
- expr * expr
- Az eredmény a két kifejezés szorzata.
- expr / expr
- Az eredmény a két kifejezés hányadosa. Az eredmény pontosságát a scale változó értéke határozza meg.
- expr % expr
- Az eredmény a "maradék", amely a következőképpen kerül kiszámolásra. Az a%b kiszámolásához először, kiszámolásra kerül az a/b, scale számjegyre. Az eredmény a következőképpen adódik: a-(a/b)*b, a pontossága a scale+scale(b) és scale(a) közül a nagyobb lesz. Ha a scale egyenlő nullával, vagy mindkét kifejezés egész, a maradék is egész lesz.
- expr ^ expr
- Az eredmény az első kifejezés a másodikra emelve. A második kifejezésnek egésznek kell lennie. (Ha a második kifejezés nem egész, egy figyelmeztetés generálódik, és az érték egész értékre csonkolódik.) Az eredmény pontossága scale lesz, ha a kitevő negatív. Ha a kitevő pozitív, az eredmény pontossága az első kifejezés pontosságának és a kitevő értékének a szorzata és - az első kifejezés és a scale változó értéke közül a nagyobb - közül a kisebb lesz. (Pl. scale(a^b) = min(scale(a)*b, max( scale, scale(a))).) Megjegyezendő, hogy az expr^0 mindig 1 értékkel tér vissza.
- ( expr )
- Ez megváltoztatja a kifejezés kiértékelésének standard precedenciáját.
- var = expr
- A változó értéke a kifejezés lesz.
- var <op>= expr
- Ez ekvivalens a "var = var <op> expr" kifejezéssel, azzal a kivétellel, hogy a "var" rész csak egyszer értékelődik ki. Ez akkor okozhat különbséget, ha a "var" egy tömb.
A relációs kifejezések speciális kifejezés fajták, amelyek mindig 0-t, vagy 1-et adnak vissza, 0-át, ha a reláció hamis, és 1-et, ha igaz. Ezek bármilyen legális kifejezésben megjelenhetnek. (A bc POSIX változatában, hogy a relációs kifejezések csak if, while és for utasításokban szerepelhetnek, illetve csak egy tesztelésük lehetséges.) A relációs operátorok a következők:
- expr1 < expr2
- Az eredmény 1, ha az expr1 kisebb, mint az expr2.
- expr1 <= expr2
- Az eredmény 1, ha az expr1 kisebb, vagy egyenlő, mint az expr2.
- expr1 > expr2
- Az eredmény 1, ha az expr1 nagyobb, mint az expr2.
- expr1 >= expr2
- Az eredmény 1, ha az expr1 nagyobb, vagy egyenlő, mint az expr2.
- expr1 == expr2
- Az eredmény 1, ha az expr1 egyenlő az expr2-vel.
- expr1 != expr2
- Az eredmény 1, ha az expr1 nem egyenlő az expr2-vel.
A boolean műveletek is legálisak. ( A POSIX bc-ben nincsenek boolean műveletek.) Minden boolean műveletnek az értéke 0, vagy 1 (hamis, vagy igaz), mint a relációs műveleteknél. A boolean műveletek a következőek:
- !expr
- Az eredmény 1, ha a kifejezés 0.
- expr && expr
- Az eredmény 1, ha a mindkét kifejezés nem 0.
- expr || expr
- Az eredmény 1, ha a bármelyik kifejezés nem 0.
A kifejezések precedenciája a következő (alacsonytól a magas felé):
|| operátor, balról asszociatív && operátor, balról asszociatív ! operátor, nem asszociatív Relációs operátorok, balról asszociatív Értékadó operátor, jobbról asszociatív + és - operátorok, balról associative *, / és % operátorok, balról asszociatív ^ operátor, jobbról asszociatív unáris - operátor, nem asszociatív ++ és -- operátorok, nem asszociatív
Ez a precedencia úgy van megválasztva, hogy a POSIX bc alá programok is korrekten fussanak. Emiatt, a relációs és logikai operátorokat az értékadó operátoroknál néha szokatlan eredmény is kijöhet. Lásd a következő kifejezést:
A legtöbb C programozó ezt úgy értelmezi, hogy a "3 < 5" (az értéke 1) kerül az "a" változóba. A bc itt a következőt csinálja, hozzárendeli a 3-at az "a" változóhoz, majd a 3-at összehasonlítja az 5-tel. A legjobb, hogyha értékadó operátort használsz relációs, és logikai operátorokkal, akkor használsz zárójeleket.
Van néhány egyéb speciális kifejezés, amelyet még a bc nyújt. Ezek a felhasználó által definiálható függvények, és a standard függvények hívása. Ezek a következő alakban jelennek meg: name(parameters) A függvényekhez lásd még a felhasználó által definiált függvények fejezetet. A standard függvények a következőek:
- length ( expression )
- A length függvény értéke a kifejezésben megadott szám értékes jegyeinek száma.
- read ( )
- A read függvény (kiterjesztés) beolvas egy számot a szabványos bemenetről, függetlenül attól, hogy a függvény hol található. Figyelmeztetés: ez problémát okozhat, ha mind a program, mind az adatok a standard bementről jönnek. A legjobb, ha ezt a függvényt csak előre megírt programoknál használjuk, amely adatokat kér a felhasználótól, de nem engedi meg, hogy a felhasználó program kódot is beírjon. A read függvény értéke a szabványos bemenetről beolvasott szám értéke, az ibase változó értékét, mint számrendszert használva a konverzió alapjául.
- scale ( expression )
- A scale függvény értéke a kifejezés tizedespont mögött szereplő számjegyeinek száma.
- sqrt ( expression )
- Az sqrt függvény értéke a kifejezés értékének a négyzetgyökével egyenlő. Ha a kifejezés negatív, egy futási hiba generálódik.
UTASÍTÁSOK¶
Az utasítások (mint a legtöbb algebrai nyelvnél) határozzák meg a kifejezések kiértékelésének sorrendjét. A bc-ben az utasítások akkor hajtódnak végre, amint "arra mód van". A végrehajtás akkor történik meg, mikor az interpreter új sor karakterrel találkozik, illetve, mikor egy, vagy több komplett utasítás felépül. Ezen azonnali végrehajtás miatt, az újsorok nagyon fontosak a bc-ben. Valójában, mind a pontosvessző, mind az újsor használható utasításelválasztóként. Egy rossz helyre rakott újsor szintaktikai hibát okoz. Mivel az újsorok utasítás elhatárolók, el lehet őket rejteni, a backslash karakter segítségével. A "\<nl>" karaktersorozattal, ahol az <nl> az újsort jelenti, az újsor csak egy szóközként jelenik meg a bc-ben. Egy utasítás lista a pontosvesszővel, vagy újsorral elválasztott utasítások sorozata. Itt következnek a bc utasításai, és az, hogy mit csinálnak: (A szögletes zárójelbe ([]) zárt részek az utasításból elhagyhatóak.)- expression
- Ez az utasítás kétféle képpen is megjelenhet. Az egyik, mikor a kifejezés "<változó> <értékadás> ...", ez egy értékadási utasítás. Ha a kifejezés nem értékadási utasítás, akkor kiértékelése után kapott eredmény kiírásra kerül a szabványos kimenetre. A szám kiírása után egy újsor is kiírásra kerül. Például, az "a=l" egy értékadási utasítás, míg az "(a=l)" egy kifejezés, amelyben van egy értékadás. Minden szám az obase változóban tárolt számrendszer alapján kerül kiírásra. Az obase változó legális értékei 2-től a BC_BASE_MAX konstansban tárolt értékig mehetnek. (Lásd még a HATÁRÉRTÉKEK fejezetet.) A 2-estől a 16-os számrendszerig a számok kiírása a szokásos módon történik. 16-osnál nagyobb számrendszereknél a bc több karakterből álló számjegyeket használ, ahol minden magasabb számrendszerbeli számjegynek a tizes számrendszerbeli számképe íródik ki. A több karakteres számjegyeket egymástól a program szóközökkel választja el. Minden számjegy annyi karakterből áll, amennyi az "obase-1" szám kiírásához kell, 10-es számrendszerben. Mivel a számok változó pontosságúak, előfordulhat, hogy néhány szám kiírása nem fér ki egy sorba. Ezeket a hosszú számokat a program sorokra tördeli, a sorok végén egy-egy "\" karakterrel. Az egy sorba kiírt karakterek maximális száma 70. A bc interaktivitása miatt, az utolsó kiírt számot eltárolja egy speciális változóban. Így az utoljára kiírt szám megkapásához nem szükséges újra leírni az egész kifejezést, hanem csak a last változó értékét kell előszedni. A last változónak értéket is lehet adni, ez esetben a benne tárolt utolsó érték egyszerűen felülíródik. Ez az érték addig marad meg benne, amíg a következő szám kiírásra nem kerül, vagy más értéket nem adnak neki. (Némelyik implementáció megengedi, hogy a last változóra egy egyedüli ponttal ("."), amely nem része számnak, hivatkozzunk.)
- string
- A string a kimenetre íródik ki. A stringek idézőjellel kezdődnek, és bármilyen karaktert tartalmazhatnak a következő idézőjelig. Egyetlen karakter sem kerül értelmezésre, még az újsor karakter sem. A string kiírása után nem íródik ki újsor karakter.
- print list
- A print utasítás (kiterjesztés), a kiírás egy újabb módozatát kínálja. A "list" egy string és kifejezés lista, vesszővel elválasztva. Minden string vagy kifejezés a lista sorrendjében íródik ki. Záró újsor nem íródik ki. A kifejezések kiértékelődnek, és az eredményük a last változóban tárolásra kerül. A stringek pedig egyszerűen kiírásra kerülnek, speciális karaktereket is tartalmazhatnak. A speciális karakterek a backslalsh karakterrel kezdődnek (\). A speciális karakterek a következőek: "a" (figyelmeztetés, vagy bip), "b" (backspace), "f" (lapdobás), "n" (újsor), "r" (kocsi vissza), "q" (idézőjel), "t" (tabulátor) és "\" (backslash). Minden más, a backslash után levő karaktert figyelmen kívül hagy a program.
- { utasítás_lista }
- Ez egy összetett utasítás. Ennek segítségével lehet több végrehajtandó utasítást egybekapcsolni.
- if ( kifejezés ) then utasítás1 [else utasítás2]
- Az if kiértékeli a kifejezést, és végrehajtja az utasítás1-et, vagy az utasítás2-t, a kifejezés értékétől függően. Ha a kifejezés eredménye nem nulla, az utasítás1 hajtódik végre. Ha az utasítás2 létezik, és a kifejezés eredménye nulla, az utasítás2 hajtódik végre. (Az else ág kiterjesztés.)
- while ( kifejezés ) utasítás
- A while utasítás mindaddig végrehajtja az utasítást, amíg a kifejezés eredménye nem nulla. Az utasítás minden végrehajtása előtt kiértékeli a kifejezést. A ciklus akkor fejeződik be, ha a kifejezés eredménye nulla lesz, vagy ha végrehajtódik egy break utasítás.
- for ( [kifejezés1] ; [kifejezés2] ; [kifejezés3] ) utasítás
- A for utasítás egy utasítás ismételt végrehajtását vezérli. A kifejezés1 a ciklus előtt kiértékelődik. A kifejezés2 az utasítás minden végrehajtása előtt kiértékelődik. Ha nem nulla, az utasítás végrehajtódik, ha nulla, a ciklus véget ér. Az utasítás minden végrehajtása után, a kifejezés3 kiértékelődik, mielőtt a kifejezés2 kiszámolódna. Ha a kifejezés1 és a kifejezés3 hiányzik, a kiértékelődésük helyén semmi nem fog történni. Ha a kifejezés2 hiányzik, az olyan, mintha a kifejezés2 helyén egy olyan kifejezés lenne, amelynek az eredménye mindig 1. (Az opcionális kifejezések egy kiterjesztés.) A következő ekvivalens kódokat ad a for utasításra:
kifejezés1; while (kifejezés2) { utasítás; kifejezés3; }
- break
- Ezzel az utasítással ki lehet lépni a legbelső while, vagy for utasításból.
- continue
- Ez az utasítás (kiterjesztés) azt eredményezi, hogy a legbelső for utasítás egy új ciklust kezd.
- halt
- Ez az utasítás (kiterjesztés), ha végrehajtódik, azt eredményezi, hogy a bc kilép.
- return
- Nulla értékkel tér vissza egy függvényből (lásd még a függvények fejezetet).
- return ( expression )
- A kifejezés eredményével tér vissza a függvényből (lásd még a függvények fejezetet).
PSZEUDO UTASÍTÁSOK¶
Ezek az utasítások a tradicionális értelemben nem utasítások. Nem hajtódnak végre. Funkciójukat "fordítási" időben fejtik ki.- limits
- Kiírja a bc adott verziója által használt határokat. Kiterjesztés.
- quit
- Ha a quit utasítást beolvassa, a bc feldolgozó kilép. Nem számít, hogy az utasítás hol található (pl. az "if (0 == 1) quit" hatására is kilép a bc.)
- warranty
- Kiírja a figyelmeztető üzenetet. Kiterjesztés.
FÜGGVÉNYEK¶
A függvényekkel definiálhatunk számításokat, amelyeket csak később kívánunk végrehajtani. A függvények a bc -ben mindig egy értéket számolnak, és azt visszaadják a hívónak. A függvény definíciója "dinamikus" abban az értelemben, hogy mindaddig definiálatlan, amíg a feldolgozó nem találkozik vele a bemeneten. Ez a definícó mindaddig használható, amíg egy ugyanezen névű függvény definicóval nem találkozik. Az új definíció felülírja a régit. Egy függvény definíciója a következőképpen néz ki:define name ( parameters ) { newline auto_list statement_list }
A paraméterek számok, vagy tömbök lehetnek (kiterjesztés). A függvény definícójában nulla, vagy több paraméter definiálható, vesszővel elválasztva. A számok csak érték szerinti átadással, a tömbök csak cím szerinti átadással hívódnak meg. A tömböket a paraméterek között a "név[]" módon kell specifikálni. A függvényhívásnál a szám paraméterek teljes kifejezések lehetnek. A tömböknél ugyanaz a jelölés használandó, mint a definiáláskor. A nevesitett tömbök cím szerinti átadással kerülnek a függvényhez. Mivel a függvény definíciója dinamikus, a paraméterek száma és típusa csak a hívás pillanatában kerül ellenőrzésre. Ha ebben eltérés mutatkozik, egy futási-hiba váltódik ki. Futási-hiba váltódik ki akkor is, ha egy nem létező függvényt hívunk meg.
Az auto_list egy opcionális változó lista, amely "helyi" változókat tartalmazza. A szintaxisa: "auto név, ... ;". (A pontosvessző opcionális.) Minden név egy auto változó neve. Tömbök is definiálhatóak így, a szokásos módon. Ezek a változók a vermen kapnak helyet, a függvény belépése után. A változók ezután inicializálásra kerülnek nulla kezdőértékkel, és a függvény végrehajtása során használhatóak. Amikor a függvény kilép, ezeket a változókat eltávolítja a veremből, így az eredeti értékük helyreállítódik. A paraméterek is auto változók, amelyek a függvény meghívásakor kapják meg értéküket. Az auto változók különböznek a tradícionális helyi változóktól a következő dologban: ha A meghívja a B függvényt, B látja az A auto változóit, hacsak B-ben nincs ugyanezen néven is auto változó definiálva. Azon tény miatt, hogy az auto változók és a paraméterek egy vermen kapnak helyet, a bc kezeli a rekurzív függvényeket is.
A függvény törzse bc utasítások listája. Az utasításokat pontosvesszők, vagy újsorok választják el. A return utasítás hatására a függvény végrehajtása véget ér, és visszatér egy értékkel. Az első forma, a "return", 0-át ad vissza a hívónak, míg a második, "return ( kifejezés )", kiértékeli a kifejezést, és az eredményt adja vissza. A függvény végén, ha mást nem írunk ki, mindig van egy "return (0)", ez megkímél attól, hogy explicite ki kelljen írni a return utasítást.
A függvényeknél megváltozik az ibase változó használata is. A függvény törzsében szereplő minden konstans, a függvény hívásakor használatos ibase alapján konvertálódik. Ha az ibase-t megváltoztatjuk egy függvényben, annak nem lesz hatása, kivéve a read standard függvényt, amely mindig az ibase aktuális értékét használja a számok konvertálásához.
MATEMATIKAI KÖNYVTÁR¶
Ha a bc-t a -l opcióval indítjuk, a matematikai könyvtár betöltődik, és a pontosság 20-as lesz. A matematikai függvények azzal a pontossággal számolják ki az eredményt, amely a meghívásukkor be volt állítva. A matematikai könyvtár a következő függvényeket definiálja:- s (x)
- Az x (radián) színusza.
- c (x)
- Az x (radián) koszínusza.
- a (x)
- Az x arkusz tangense.
- l (x)
- Az x természetes logaritmusa.
- e (x)
- Az e x-edik hatványa.
- j (n,x)
- Az n-ed rendű Bessel fuggvenye x-nek.
PÉLDÁK¶
A /bin/sh-ban a következő utasítás visszaadja a "pi" értékét a pi környezeti változóban.Az itt következő példában a matematikai könyvtárban található hatvány függvény definícióját mutatjuk be. A függvény POSIX bc nyelven íródott.
scale = 20 /* Kihasználja a következó tényt: e^x = (e^(x/2))^2. Mikor az x elég kicsi, a következő sort használjuk: e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { auto a, d, e, f, i, m, v, z /* Ellenőrzi az x előjelét. */ if (x<0) { m = 1 x = -x } /* Elófeltétel. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; } /* Inicializálja a változókat. */ 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ű csekkfüzet egyenleg kiszámolására. Legjobb, ha ezt a programot fájlba lementjük, hogy többször is használhassuk anélkül, hogy újra be kelljen gépelni.
scale=2 print "\nCsekkfüzet program!\n" print " Emlékeztető, a letétek negatív tranzakciók.\n" print " Kilépés 0 összegű tranzakció bevitelével.\n\n" print "Kezdeti egyenleg? "; bal = read() bal /= 1 print "\n" while (1) { "jelenlegi egyenleg = "; bal "tranzakció? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1 } quit
A következő függvény a faktoriális rekurzív definíciója.
define f (x) { if (x <= 1) return (1); return (f(x-1) * x); }
ELTÉRÉSEK¶
A bc ezen verziója a POSIX P1003.2/D11 tervezete alapján készült és a tervezethez és a tradícionális implementációhoz képest sok bővítést és különbséget tartalmaz. Ez nincs implementálva a tradícionális dc(1)-ben. Ez a verzió egy egyszerű feldolgozó, amely csak átfordítja a programot. Egy "nem dokumentált" kapcsoló (-c) kiírja az átfordított programot a szabványos kimenetre, és nem futtatja le. Ez főleg az értelmező nyomkövetésekor és a matematikai könyvtár előkészítésekor használatos.A különbségek legfőbb forrásai a kiterjesztések, hol egy szolgáltatás lett kiterjesztve, hogy több lehetősége legyen, hol pedig új szolgáltatás lett létrehozva. A következó lista megmutatja a különbségeket és a kiterjesztéseket.
- LANG környezeti változó
- Ez a verzió nem követi a POSIX szabványt a LANG környezeti változó használatában, és minden környezeti változó az "LC_" prefixszel kezdődik.
- nevek
- A tradícionális és a POSIX bc -ben a funkciók, változók és tömbök nevei csak egy karakter hosszúak lehettek. Itt már több karaktert is használhatunk, de a neveknek betűvel kell kezdődni és csak betűket számokat és aláhúzásjeleket tartalmazhatnak.
- Stringek
- A stringek nem tartalmazhatnak NUL (ASCII nulla) karaktert. A POSIX szerint bármilyen karakter lehet egy stringben.
- last
- A POSIX bc-ben nincs last változó. Néhány implementáció a pontot (.) használja erre a célra.
- összehasonlítások
- A POSIX bc csak az if, vagy a while utasításban enged meg összehasonlításokat, vagy a for utasítás második kifejezésében. Továbbá, utasításonként csak egy relációs operátor van megengedve.
- if utasítás, else ág
- A POSIX bc-ben nincs else ág.
- for utasítás
- A POSIX bc-ben minden kifejezésnek szerepelnie kell.
- &&, ||, !
- A POSIX bc-ben nincsenek logikai operátorok.
- read függvény
- A POSIX bc-ben nincs read függvény.
- print utasítás
- A POSIX bc-ben nincs print utasítás.
- continue utasítás
- A POSIX bc-ben nincs continue utasítás.
- tömb paraméterek
- A POSIX bc-ben nincsenek tömb paraméterek. Más implementációkban lehetnek.
- =+, =-, =*, =/, =%, =^
- A POSIX bc-ben nincs szükség ezekre a "régi stílusú" értékadó operátorokra. Ez a verzió megengedi ezeket. Használd a limits utasítást, hogy megtudd, hogy az installált verzió megengedi-e ezeket. Ha igen, az "a =- 1" kifejezés csökkenti az a értékét 1-gyel, egyébként pedig az a értékét beállítja -1-re.
- szóközök a számokban
- A bc más implementációi megengedik szóközök használatát a számokban. Például, az "x=1 3" kifejezés az x változóhoz hozzárendeli a 13-at. Ebben a bc-ben ugyanez az utasítás szintaktikai hibát ad.
- hibák és végrehajtás
- Ez az impelmentáció különbözik a többitől abban, hogy mely kódokat hajtja végre, mikor egy szintaktikai, vagy más hibába belefut. Ha egy szintaktikai hibát talál a függvény definíciójában, a hibakezelő megpróbálja megtalálni az utasítás elejét, és folytatni a függvény feldolgozását. Ha a szintaktikai hiba a függvény törzsében következik be, a függvény nem lesz definiálva, és nem lehet meghívni sem. Az interaktív végrehajtási blokkokban levő szintaktikai hibák érvénytelenítik az egész blokkot. Egy végrehajtási blokknak minősül az az utasítássor, amely a következő soremelésig tart. Például:
a = 1 b = 2
{ a = 1 b = 2 }
- Megszakítások
- Egy interaktív végrehajtás során, a SIGINT szignál (általában a terminálról érkező Control-C karakter generálja) hatására a jelenlegi blokk végrehajtása megszakad. Kijelzésre kerül egy "futási" hiba, hogy melyik függvény lett megszakítva. Miután minden futási struktúra kiürül, egy üzenet kerül kiírásra a felhasználó felé, hogy a bc kész további adatok fogadására. Minden korábban definiált függvény továbbra is definiálva marad, és minden nem-auto változóban a megszakításkori érték lesz. Minden auto változó (a függvények paraméterei is) törlésre kerül a kiürítési eljárás során. Nem-interaktív végrehajtáskor a SIGINT szignál az egész bc futását megszakítja.
HATÁROK¶
A következő határok vannak beépítve ebbe a bc -be. Néhányuk egy installálással megváltoztatható. Az aktuális értékeik megszerzéséhez használd a limits utasítást.- BC_BASE_MAX
- A legnagyobb kimeneti számrendszer, jelenleg 999. A maximum bemeneti számrendszer 16.
- BC_DIM_MAX
- Ez a jelenlegi pontossági határ, 655535. Az ön installációjában más lehet.
- BC_SCALE_MAX
- A tizedes pont előtti és utáni számjegyek számát az INT_MAX határozza meg.
- BC_STRING_MAX
- A karakterek maximális száma egy stringben INT_MAX.
- exponens
- A hatványozás operátor (^) kitevőjének maximum értékét a LONG_MAX határozza meg.
- szorzás
- A szorzó rutin inkorrekt eredményt adhat, ha a számnak (LONG_MAX / 90)-nél több számjegye van. 32-bites long-nál ez 23,860,929 számjegy.
- kód méret
- Minden függvénynek és a "fő" programnak is limitálva van a mérete 16384 byte lefordított kódban. Ez a határ (BC_MAX_SEGS) könnyen túlléphető, ha több, mint 16 1024 byte-os szegmensünk van.
- változó nevek
- A jelenlegi limit az egyedi nevekre 32767 mind az egyszerű változókra, mind a tömbökre és a függvényekre.
FÁJLOK¶
A legtöbb installációban a bc-nek nincs szüksége egyéb fájlokra. Míg a végrehajtható program hossza fontos, illetve a C fordító nem tudja kezelni a nagyon hosszú stringeket, a bc a standard matematikai könyvtárat a /usr/local/lib/libmath.b fájlból olvassa be. (A fájl helye rendszerenként változhat, lehet /lib/libmath.b is.)DIAGNOSZTIKA¶
Ha egy a parancssorban szereplő fájl nem nyitható meg, a bc üzen, hogy a fájl nem elérhető, és kilép. Ugyanígy, a fordítási és a futási idejű diagnosztika is önmagyarázó.HIBÁK¶
A hibakezelés még nem túl jó.SZERZŐ¶
Philip A. Nelson phil@cs.wwu.edu
KÖSZÖNETNYILVÁNÍTÁSOK¶
A szerző szeretné megköszönni Setve Sommars-nak (Steve.Sommars@att.com), hogy oly nagy mértékben segített az implementáció tesztelésében. Sok nagyon jó tanácsot adott. Segítségével egy sokkal jobb terméket sikerült létrehozni.MAGYAR FORDÍTÁS¶
Csehi András <acsehi@flexum.hu>. |