A bc egy lebegőpontos kalkulátor nyelv, 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 sorrendjében dolgozza fel. Miután minden fájlt feldolgozott a bc a standard 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 standard 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.
Használata A parancs általános alakja: bc [ -lws ] [ fájl ... ]
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 tizedespont után levőkét. Például:
A .000001 számnak a hossza és a léptéke is 6. 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 tizedes 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.
Ezeknek a változóknak lehet értéket adni, de kifejezésben is használhatóak.
Kifejezések és utasítások
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 egyszá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 legális 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[fIexpr]
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.
- 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))).) Megjegyzendő, 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 asszociatív *, / é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(fIparametersfB) 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 standard 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 bemenetrő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 standard 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.
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