next up previous index
Következő: 15.10.9 UTASÍTÁSOK Fel: 15.10 bc(1) Előző: 15.10.7 MEGJEGYZÉS   Index

15.10.8 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 mindíg 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 mindíg 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[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.

-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ésfajtá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 mindkét kifejezés nem 0.
expr || expr
Az eredmény 1, ha 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á írt 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, ha é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 standard bemenetről, függetlenül attól, hogy a függvényhol 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 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.


next up previous index
Következő: 15.10.9 UTASÍTÁSOK Fel: 15.10 bc(1) Előző: 15.10.7 MEGJEGYZÉS   Index

1999-09-17