Provided by:
manpages-pl-dev_20060617-3_all 
NAZWA
expr - Oblicz wyraenie
SK/LADNIA
expr arg ?arg arg ...?
_________________________________________________________________
OPIS
Lczy kolejne parametry arg (dodajc midzy nimi spacje) i analizuje wynik
jako wyraenie Tcl, zwracajc warto. Dozwolone wyraenia Tcl s podzbiorem
operatorow dozwolonych w wyraeniach C i maj takie samo znaczenie i
pierwszestwo, jak odpowiadajce im operatory C. Wyraenia daj prawie
zawsze wyniki numeryczne (calkowite, lub zmiennoprzecinkowe). Np.
wyraenie
expr 8.2 + 6
przechodzi w 14.2. Wyraenia Tcl roni si od wyrae C tym, e operandy s
podawane w inny sposob. Poza tym, wyraenia Tcl obsluguj operandy
nienumeryczne oraz porownania lacuchow.
OPERANDY
Wyraenie Tcl sklada si z kombinacji operandow, operatorow i nawiasow.
Midzy operandami i operatorami mona uywa bialych spacji; s one
ignorowane. Tam gdzie mozliwe, operandy s interpretowane jako wartoci
calkowite. Wartoci calkowite mona podawa dziesitnie (normalny wypadek),
osemkowo (jeli pierwszym znakiem operandu jest 0) lub szesnastkowo
(jeli pierwszymi znakami operandu s 0x). Jeli operand nie jest w adnym
z powyszszych formatow calkowitych, to o ile jest to moliwe, jest
traktowany jako liczba zmiennoprzecinkowa. Zmienne zmiennoprzecinkowe
mog by podawane w dowolny ze sposobow, obslugiwanych przez zgodny z
ANSI kompilator C (poza tym, e przyrostki f, F, l i L w wikszoci
instalacji nie bd dozwolone). Na przyklad, wszystkie nastpujce liczby
s poprawnymi liczbami zmiennoprzecinkowymi: 2.1, 3., 6e4, 7.91e+16.
Jesli nie jest moliwa interpretacja numeryczna, to operand jest
pozostawiany jako lacuch (wtedy jednak mona stosowa tylko ograniczony
zestaw operatorow).
Operandy mog by podawane w nastpujce sposoby:
[1] Jako warto numeryczn, calkowit albo zmiennoprzecinkow.
[2] Jako zmienn Tcl, przy uyciu standardowej notacji $. Warto
zmiennej zostanie wykorzystana jako operand.
[3] Jako lacuch ujty w podwojne cudzyslowy. Przetwarzanie wyraenia
bdzie wraliwe na podstawienia ukonikowe, zmiennych i komend, i
uyje wyniku jako operandu.
[4] Jako lacuch ujty w nawiasy klamrowe. Znaki midzy klamr otwierajc
i zamykajc zostan uyte jako operand bez adnego podstawiania.
[5] Jako komenda Tcl w naiwasach kwadratowych. Komenda zostanie
wykonana, a jej wynik uyty jako operand.
[6] Jako funkcja matematyczna, ktorej argumenty maj dowoln z
powyszych postaci, taka jak sin($x). Zobacz niej dla listy
zdefiniowanych funkcji.
Tam gdzie zachodz podstawienia, s one dokonywane przez instrukcje
wyraenia. Jednak mogl te zosta ju wykonany inny poziom podstawiania,
dokonywany przez przetwarzacza polece przed wywolaniem przetwarzacza
wyrae. Jak pokazuje ponisza dyskusja, zwykle najlepiej jest ujmowa
wyraenia w klamry, co zapobiega by przetwarzacz dokonal podstawie
zawartoci.
Dla pewnych przykladow prostych wyrae, zalomy e zmienna a ma warto 3, a
zmienna b warto 6. Nastpnie, komenda po lewej stronie kadej z linii da
wynik, widoczny po prawej stronie.
expr 3.1 + $a 6.1
expr 2 + "$a.$b" 5.6
expr 4*[llength "6 2"] 8
expr {{word one} < "word $a"}0
OPERATORY
Poniej wymienione s prawidlowe operatory; s one zgrupowane wedlug
malejcego priorytetu:
- + ~ ! Jednoargumentowy minus, jednoargumentowy plis,
bitowy NOT i logiczny NOT. aden z tych operatorow
nie moe by stosowany do operandow lacuchowych, a
bitowy NOT moe by stosowany tylko do liczb
calkowitych.
* / % Mnoenie, dzielenie, reszta. aden z tych operatorow
nie moe by stosowany do operandow lacuchowych, a
reszta moe by stosowana tylko do liczb calkowitych.
Reszta ma zawsze znak dzielnika i jej warto
absolutna jest zawsze mnijesza ni warto dzielnika.
+ - Dodawanie i odejmowanie. Prawidlowe dla dowolnych
operandow numerycznych.
<< >> Przesuwanie w lewo i w prawo. Prawidlowe tylko dla
operandow calkowitych. Przesuwanie w prawo
propaguje bit znaku.
< > <= >= Logiczny mniejszy, wikszy, mniejszy lub rowny,
wikszy lub rowny. Kady operator daje 1 jeli
warunek jest spelniony lub 0 w przeciwnym wypadku.
Operandami mog by zarowno wartoci numeryczne, jak i
lacuchowe, w ktorym wypadku dokonywane jest
porownywanie lacuchow.
== != Logiczna rowno i nierowno. Kady operator daje wynik
zero/jeden. Prawidlowe dla wszelkich operandow.
& Bitowy AND. Prawidlowy tylko dla operandow
calkowitych.
^ Bitowy XOR. Prawidlowy tylko dla operandow
calkowitych.
| Bitowy OR. Prawidlowy tylko dla operandow
calkowitych.
&& Logiczny AND. Daje 1 jeli obydwa operandy s
niezerowe, lub 0 w przeciwnym wypadku. Prawidlowe
dla operandow logicznych i numerycznych.
|| Logiczny OR. Daje 0 jeli obydwa operandy s zerowe
lub 1 w przeciwnym wypadku. Prawidlowe dla
operandow logicznych i numerycznych.
x?y:z Jeeli-to-inaczej, jak w C. Jeli x rozwija si na
warto niezerow, to wynikiem jest warto y. W
przeciwnym wypadku wartoci wynikow jest z. Operand
x musi mie warto numeryczn.
Zobacz podrcznik C dla dalszych szczegolow o wynikach, dawanych przez
operatory. Wszystkie operatory binarne grupuj si od lewej do prawej w
tym samym priorytecie. Np. komenda
expr 4*2 < 7
daje 0.
Operatory &&, || i ?: maj ``leniw analiz'', zupelnie jak w C, co
znaczy, e operandy nie s analizowane jeli nie ma takiej potrzeby do
okrelenia wyniku. Np. w komendzie
expr {$v ? [a] : [b]}
analizowane bdzie tylko jedno z [a] lub [b], zalenie od wartoci $v.
Zauwa jednak, e jest to prawdziwe tylko jeli cale wyraenie jest ujte w
nawiasy klamrowe; w przeciwnym wypadku przetwarzacz Tcl przemieli
zarowno [a] jak i [b] jeszcze przed wywolaniem komendy expr.
FUNKCJE MATEMATYCZNE
Tcl obsluguje nastpujce funkcje matematyczne wyrae:
acos cos hypot sinh
asin cosh log sqrt
atan exp log10 tan
atan2 floor pow tanh
ceil fmod sin
Kada z tych funkcji wola funkcj biblioteki matematycznej o tej samej
nazwie. Tcl ponadto implemntuje nastpujce funkcje dla konwersji midzy
liczbami calkowitymi, zmiennoprzecinkowymi i losowania liczb losowych:
abs(arg)
Zwraca warto modulu arg. Arg moe by liczb calkowit, lub
zmiennoprzecinkow; wynik jest zwracany w tej samej postaci.
double(arg)
Jeli arg jest liczb zmiennoprzecinkow, zwracane jest arg. W
przeciwnym wypadku arg jest konwertowany na posta
zmiennoprzecinkow i zwracany w tej postaci.
int(arg)
Jak wyej, ale zamiana na liczb calkowit.
rand() Zwraca liczb zmiennoprzecinkow w zakresie od zera do 1. Nasienie
pochodzi z wewntrznego zegara maszyny, lub moe by ustawiane
rcznie funkcj srand.
round(arg)
Jeli arg jest calkowite, zwracane jest arg. W przeciwnym wypadku
arg jest konwertowane na posta calkowit poprzez zaokrglanie.
srand(arg)
Parametr arg, ktory musi by liczb calkowit, sluy do resetowania
nasienia generatora liczb losowych. Zwraca pierwsz liczb losow
dla tego nasienia. Kady interpreter ma swoje wlasne nasienie.
W dodatku do tych predefiniowanych funkcji, aplikacje mog definiowa
inne funkcje, korzystajc z Tcl_CreateMathFunc().
TYPY, PRZEPE/LNIENIE I PRECYZJA
Wszystkie obliczenia wewntrzne na liczbach calkowitych s dokonywane w
typie long z C, a wszystkie obliczenia zmiennoprzecinkowe na typie
double. Podczas konwersji lacucha na liczb zmiennoprzecinkow,
wykrywane jest przepelnienie eksponentne, co powoduje bld Tcl. Dla
konwersji lacucha na liczb calkowit, wykrywanie przepelnienia zaley od
zachowania pewnych funkcji biblioteki C, wic raczej nie mona na tym
polega.
Konwersja midzy reprezentacjami calkowitymi, zmiennoprzecinkowymi i
lacuchowymi operandow jest wykonywana automatycznie tam gdzie potrzeba.
Dla oblicze arytmetycznych zmienne calkowite s uywane tak dlugo, a nie
pojawi si liczba zmiennoprzecinkowa i wtedy zaczyna si uywanie liczb
zmiennoprzecinkowych. Na przyklad,
expr 5 / 4
zwraca 1, podczas gdy
expr 5 / 4.0
expr 5 / ( [string length "abcd"] + 0.0 )
zwraca 1.25. Wartoci zmiennoprzecinkowe s zawsze zwracane z ``.'' lub
e, wic nie wygldaj jak liczby calkowite. Na przyklad,
expr 20.0/5.0
zwraca 4.0, nie 4.
OPERACJE /LACUCHOWE
Jeli jeden z operandow porownania jest lacuchem, a drugi ma warto
numeryczn, to operand numeryczny jest konwertowany z uyciem formatu %d
lub %g funkcji sprintf(3) jzyka C z powrotem na lacuch. Na przyklad
komendy
expr {"0x03" > "2"}
expr {"0y" < "0x12"}
zwracaj 1. Pierwsze porownanie jest dokonywane w porownaniu calkowitym,
a drugie w porownaniu lacuchowym, po przekonwertowaniu drugiego
operandu na lacuch 18. Poniewa Tcl ma tendencje do traktowania wartoci
tam gdzie moliwe jako liczby, to uywanie operatorow == i podobnych nie
jest dobrym pomyslem, jeli naprawd chcesz porownania lacuchowego;
lepiej uy komendy string compare.
ROZWAANIA O WYDAJNOCI
Jeli chcesz jak najwikszej szybkoci i najmniejszego zajmowania pamici, |
ujmuj wyraenia w klamry. Umoliwia to kompilatorowi kodu bitowego Tcl |
wygenerowanie jak najlepszego kodu. |
Jak wspomniano wyej, w wyraeniach dokonuje si dwoch podstawie: raz |
przez przetwarzacz Tcl, raz przez komend expr. Na przyklad, komendy |
set a 3 |
set b {$a + 2} |
expr $b*4 |
zwracaj 11, a nie wielokrotno 4. Jest tak dlatego, e przetwarzacz Tcl |
najpierw podstawia za $a + 2 zmienn b, a nastpnie komenda expr |
przetwarza wyraanie $a + 2*4. |
Wikszo wyrae nie wymaga drugiej kolejki podstawie. S one albo ujmowane |
w klamry, albo ich proces podstawiania zmiennych i komend daje liczby i |
lacuchy, nie wymagajce podstawie jako takich. Jednak z uwagi na to, e |
nieuklamrowione wyraenia wymagaj dwoch rund podstawie, kompilator kodu |
bitowego musi emitowa dodatkowe instrukcje obslugi takiej sytuacji. |
Najkosztowniejszy kod generowany jest dla nieuklamrowionych wyrae, |
ktore zawieraj podstawienia komend. Wyraenia te musz by implementowane |
przez generowanie nowego kodu za kadym wykonaniem wyraenia.
S/LOWA KLUCZOWE
arytmetyka, logiczny, porownanie, wyraenie, porownanie rozmyte
INFORMACJE O T/LUMACZENIU
Powysze tlumaczenie pochodzi z nieistniejcego ju Projektu Tlumaczenia
Manuali i moe nie by aktualne. W razie zauwaenia ronic midzy powyszym
opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji,
prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.