Scroll to navigation

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

Definiálja a standard matematikai könyvtárat.
Figyelmeztet a POSIX bc-hez képest használt kiterjesztésekre.
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

name
míg egy tömbre a
name[expr]
leírásával hivatkozhatunk. Hacsak másként nem specifikáljuk, az eredmény pontossága a kifejezések pontosságának a maximuma lesz.
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.
A változó értéke eggyel csökken, és az eredmény a változó új értéke lesz.
A kifejezés eredménye a változó eredeti értéke, majd a változó értéke nő eggyel.
A kifejezés eredménye a változó eredeti értéke, majd a változó értéke csökken eggyel.
Az eredmény a két kifejezés összege.
Az eredmény a két kifejezés különbsége.
Az eredmény a két kifejezés szorzata.
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.
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.
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.
A változó értéke a kifejezés lesz.
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:

Az eredmény 1, ha az expr1 kisebb, mint az expr2.
Az eredmény 1, ha az expr1 kisebb, vagy egyenlő, mint az expr2.
Az eredmény 1, ha az expr1 nagyobb, mint az expr2.
Az eredmény 1, ha az expr1 nagyobb, vagy egyenlő, mint az expr2.
Az eredmény 1, ha az expr1 egyenlő az expr2-vel.
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.
Az eredmény 1, ha a mindkét kifejezés nem 0.
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 = 3 < 5

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:

A length függvény értéke a kifejezésben megadott szám értékes jegyeinek száma.
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.
A scale függvény értéke a kifejezés tizedespont mögött szereplő számjegyeinek száma.
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.)

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.)
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.
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.
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.)
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.
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; }

Ezzel az utasítással ki lehet lépni a legbelső while, vagy for utasításból.
Ez az utasítás (kiterjesztés) azt eredményezi, hogy a legbelső for utasítás egy új ciklust kezd.
Ez az utasítás (kiterjesztés), ha végrehajtódik, azt eredményezi, hogy a bc kilép.
Nulla értékkel tér vissza egy függvényből (lásd még a függvények fejezetet).
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.

Kiírja a bc adott verziója által használt határokat. Kiterjesztés.
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.)
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 függvényhívás is egy kifejezés, a következő formában: "name(parameters)".

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.
Az x (radián) koszínusza.
Az x arkusz tangense.
l (x)
Az x természetes logaritmusa.
Az e x-edik hatványa.
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.

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

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.

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.
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.
A stringek nem tartalmazhatnak NUL (ASCII nulla) karaktert. A POSIX szerint bármilyen karakter lehet egy stringben.
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.
A POSIX bc-ben nincs else ág.
A POSIX bc-ben minden kifejezésnek szerepelnie kell.
&&, ||, !
A POSIX bc-ben nincsenek logikai operátorok.
A POSIX bc-ben nincs read függvény.
A POSIX bc-ben nincs print utasítás.
A POSIX bc-ben nincs continue utasítás.
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.
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.
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

ez két végrehajtási blokk és
{ a = 1

b = 2 }

ez egy. A futási-hibák hatására a jelenlegi blokk végrehajtása befejeződik. A futási-figyelmezetetés nem állítja meg a blokk végrehajtását.

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.

A legnagyobb kimeneti számrendszer, jelenleg 999. A maximum bemeneti számrendszer 16.
Ez a jelenlegi pontossági határ, 655535. Az ön installációjában más lehet.
A tizedes pont előtti és utáni számjegyek számát az INT_MAX határozza meg.
A karakterek maximális száma egy stringben INT_MAX.
A hatványozás operátor (^) kitevőjének maximum értékét a LONG_MAX határozza meg.
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.
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.
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>

.