NAZWA¶
expr - Oblicz wyrażenie
SKŁADNIA¶
expr arg ?
arg arg ...?
OPIS¶
Uwaga! To tłumaczenie może być nieaktualne!
Łączy kolejne parametry
arg (dodając między
nimi spacje) i analizuje wynik jako wyrażenie Tcl, zwracając
wartość. Dozwolone wyrażenia Tcl są podzbiorem
operatorów dozwolonych w wyrażeniach C i mają takie samo
znaczenie i pierwszeństwo, jak odpowiadające im operatory C.
Wyrażenia dają prawie zawsze wyniki numeryczne
(całkowite, lub zmiennoprzecinkowe). Np. wyrażenie
przechodzi w 14.2. Wyrażenia Tcl różnią się
od wyrażeń C tym, że operandy są podawane w inny
sposób. Poza tym, wyrażenia Tcl obsługują operandy
nienumeryczne oraz porównania łańcuchów.
OPERANDY¶
Wyrażenie Tcl składa się z kombinacji operandów,
operatorów i nawiasów. Między operandami i operatorami
można używać białych spacji; są one
ignorowane. Tam gdzie mozliwe, operandy są interpretowane jako
wartości całkowite. Wartości całkowite
można podawać dziesiętnie (normalny wypadek),
ósemkowo (jeśli pierwszym znakiem operandu jest
0) lub
szesnastkowo (jeśli pierwszymi znakami operandu są
0x).
Jeśli operand nie jest w żadnym z powyszszych formatów
całkowitych, to o ile jest to możliwe, jest traktowany jako
liczba zmiennoprzecinkowa. Zmienne zmiennoprzecinkowe mogą być
podawane w dowolny ze sposobów, obsługiwanych przez zgodny z
ANSI kompilator C (poza tym, że przyrostki
f,
F,
l
i
L w większości instalacji nie będą
dozwolone). Na przykład, wszystkie następujące liczby
są poprawnymi liczbami zmiennoprzecinkowymi: 2.1, 3., 6e4, 7.91e+16.
Jesli nie jest możliwa interpretacja numeryczna, to operand jest
pozostawiany jako łańcuch (wtedy jednak można
stosować tylko ograniczony zestaw operatorów).
Operandy mogą być podawane w następujące sposoby:
- [1]
- Jako wartość numeryczną, całkowitą albo
zmiennoprzecinkową.
- [2]
- Jako zmienną Tcl, przy użyciu standardowej notacji $.
Wartość zmiennej zostanie wykorzystana jako operand.
- [3]
- Jako łańcuch ujęty w podwójne
cudzysłowy. Przetwarzanie wyrażenia będzie
wrażliwe na podstawienia ukośnikowe, zmiennych i komend, i
użyje wyniku jako operandu.
- [4]
- Jako łańcuch ujęty w nawiasy klamrowe. Znaki
między klamrą otwierającą i
zamykającą zostaną użyte jako operand bez
żadnego podstawiania.
- [5]
- Jako komenda Tcl w naiwasach kwadratowych. Komenda zostanie wykonana, a
jej wynik użyty jako operand.
- [6]
- Jako funkcja matematyczna, której argumenty mają
dowolną z powyższych postaci, taka jak sin($x).
Zobacz niżej dla listy zdefiniowanych funkcji.
Tam gdzie zachodzą podstawienia, są one dokonywane przez
instrukcje wyrażenia. Jednak mógł też
zostać już wykonany inny poziom podstawiania, dokonywany przez
przetwarzacza poleceń przed wywołaniem przetwarzacza
wyrażeń. Jak pokazuje poniższa dyskusja, zwykle najlepiej
jest ujmować wyrażenia w klamry, co zapobiega by przetwarzacz
dokonał podstawień zawartości.
Dla pewnych przykładów prostych wyrażeń,
załóżmy że zmienna
a ma
wartość 3, a zmienna
b wartość 6.
Następnie, komenda po lewej stronie każdej 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¶
Poniżej wymienione są prawidłowe operatory; są one
zgrupowane według malejącego priorytetu:
- - + ~ !
- Jednoargumentowy minus, jednoargumentowy plis, bitowy NOT i logiczny NOT.
Żaden z tych operatorów nie może być stosowany
do operandów łańcuchowych, a bitowy NOT może
być stosowany tylko do liczb całkowitych.
- * / %
- Mnożenie, dzielenie, reszta. Żaden z tych operatorów
nie może być stosowany do operandów
łańcuchowych, a reszta może być stosowana
tylko do liczb całkowitych. Reszta ma zawsze znak dzielnika i jej
wartość absolutna jest zawsze mnijesza niż
wartość dzielnika.
- + -
- Dodawanie i odejmowanie. Prawidłowe dla dowolnych operandów
numerycznych.
- << >>
- Przesuwanie w lewo i w prawo. Prawidłowe tylko dla operandów
całkowitych. Przesuwanie w prawo propaguje bit znaku.
- < > <= >=
- Logiczny mniejszy, większy, mniejszy lub równy,
większy lub równy. Każdy operator daje 1 jeśli
warunek jest spełniony lub 0 w przeciwnym wypadku. Operandami
mogą być zarówno wartości numeryczne, jak i
łańcuchowe, w którym wypadku dokonywane jest
porównywanie łańcuchów.
- == !=
- Logiczna równość i nierówność.
Każdy operator daje wynik zero/jeden. Prawidłowe dla
wszelkich operandów.
- &
- Bitowy AND. Prawidłowy tylko dla operandów
całkowitych.
- ^
- Bitowy XOR. Prawidłowy tylko dla operandów
całkowitych.
- |
- Bitowy OR. Prawidłowy tylko dla operandów
całkowitych.
- &&
- Logiczny AND. Daje 1 jeśli obydwa operandy są niezerowe, lub
0 w przeciwnym wypadku. Prawidłowe dla operandów logicznych
i numerycznych.
- ||
- Logiczny OR. Daje 0 jeśli obydwa operandy są zerowe lub 1 w
przeciwnym wypadku. Prawidłowe dla operandów logicznych i
numerycznych.
- x?y:z
- Jeżeli-to-inaczej, jak w C. Jeśli x rozwija
się na wartość niezerową, to wynikiem jest
wartość y. W przeciwnym wypadku
wartością wynikową jest z. Operand x
musi mieć wartość numeryczną.
Zobacz podręcznik C dla dalszych szczegółów o
wynikach, dawanych przez operatory. Wszystkie operatory binarne grupują
się od lewej do prawej w tym samym priorytecie. Np. komenda
daje 0.
Operatory
&&,
|| i
?: mają ``leniwą
analizę'', zupełnie jak w C, co znaczy, że operandy nie
są analizowane jeśli nie ma takiej potrzeby do określenia
wyniku. Np. w komendzie
analizowane będzie tylko jedno z
[a] lub
[b],
zależnie od wartości
$v. Zauważ jednak, że
jest to prawdziwe tylko jeśli całe wyrażenie jest
ujęte w nawiasy klamrowe; w przeciwnym wypadku przetwarzacz Tcl
przemieli zarówno
[a] jak i
[b] jeszcze przed
wywołaniem komendy
expr.
FUNKCJE MATEMATYCZNE¶
Tcl obsługuje następujące funkcje matematyczne
wyrażeń:
acos |
cos |
hypot |
sinh |
asin |
cosh |
log |
sqrt |
atan |
exp |
log10 |
tan |
atan2 |
floor |
pow |
tanh |
ceil |
fmod |
sin |
|
Każda z tych funkcji woła funkcję biblioteki matematycznej
o tej samej nazwie. Tcl ponadto implemntuje następujące funkcje
dla konwersji między liczbami całkowitymi, zmiennoprzecinkowymi
i losowania liczb losowych:
- abs(arg)
- Zwraca wartość modułu arg. Arg
może być liczbą całkowitą, lub
zmiennoprzecinkową; wynik jest zwracany w tej samej postaci.
- double(arg)
- Jeśli arg jest liczbą zmiennoprzecinkową,
zwracane jest arg. W przeciwnym wypadku arg jest
konwertowany na postać zmiennoprzecinkową i zwracany w tej
postaci.
- int(arg)
- Jak wyżej, ale zamiana na liczbę
całkowitą.
- rand()
- Zwraca liczbę zmiennoprzecinkową w zakresie od zera do 1.
Nasienie pochodzi z wewnętrznego zegara maszyny, lub może
być ustawiane ręcznie funkcją srand.
- round(arg)
- Jeśli arg jest całkowite, zwracane jest arg. W
przeciwnym wypadku arg jest konwertowane na postać
całkowitą poprzez zaokrąglanie.
- srand(arg)
- Parametr arg, który musi być liczbą
całkowitą, służy do resetowania nasienia
generatora liczb losowych. Zwraca pierwszą liczbę
losową dla tego nasienia. Każdy interpreter ma swoje
własne nasienie.
W dodatku do tych predefiniowanych funkcji, aplikacje mogą
definiować inne funkcje, korzystając z
Tcl_CreateMathFunc().
TYPY, PRZEPEŁNIENIE I PRECYZJA¶
Wszystkie obliczenia wewnętrzne na liczbach całkowitych są
dokonywane w typie
long z C, a wszystkie obliczenia zmiennoprzecinkowe
na typie
double. Podczas konwersji łańcucha na
liczbę zmiennoprzecinkową, wykrywane jest przepełnienie
eksponentne, co powoduje błąd Tcl. Dla konwersji
łańcucha na liczbę całkowitą, wykrywanie
przepełnienia zależy od zachowania pewnych funkcji biblioteki C,
więc raczej nie można na tym polegać.
Konwersja między reprezentacjami całkowitymi, zmiennoprzecinkowymi
i łańcuchowymi operandów jest wykonywana automatycznie
tam gdzie potrzeba. Dla obliczeń arytmetycznych zmienne
całkowite są używane tak długo, aż nie
pojawi się liczba zmiennoprzecinkowa i wtedy zaczyna się
używanie liczb zmiennoprzecinkowych. Na przykład,
zwraca 1, podczas gdy
expr 5 / 4.0
expr 5 / ( [string length "abcd"] + 0.0 )
zwraca 1.25. Wartości zmiennoprzecinkowe są zawsze zwracane z ``
.'' lub
e, więc nie wyglądają jak liczby
całkowite. Na przykład,
zwraca
4.0, nie
4.
OPERACJE ŁAŃCUCHOWE¶
Jeśli jeden z operandów porównania jest
łańcuchem, a drugi ma wartość numeryczną,
to operand numeryczny jest konwertowany z użyciem formatu
%d lub
%g funkcji
sprintf(3) języka C z powrotem na
łańcuch. Na przykład komendy
expr {"0x03" > "2"}
expr {"0y" < "0x12"}
zwracają 1. Pierwsze porównanie jest dokonywane w
porównaniu całkowitym, a drugie w porównaniu
łańcuchowym, po przekonwertowaniu drugiego operandu na
łańcuch
18. Ponieważ Tcl ma tendencje do
traktowania wartości tam gdzie możliwe jako liczby, to
używanie operatorów
== i podobnych nie jest dobrym
pomysłem, jeśli naprawdę chcesz porównania
łańcuchowego; lepiej użyć komendy
string
compare.
ROZWAŻANIA O WYDAJNOŚCI¶
Jeśli chcesz jak największej szybkości i najmniejszego
zajmowania pamięci, ujmuj wyrażenia w klamry. Umożliwia
to kompilatorowi kodu bitowego Tcl wygenerowanie jak najlepszego kodu.
Jak wspomniano wyżej, w wyrażeniach dokonuje się
dwóch podstawień: raz przez przetwarzacz Tcl, raz przez
komendę
expr. Na przykład, 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 następnie komenda
expr przetwarza wyrażanie
$a + 2*4.
Większość wyrażeń nie wymaga drugiej kolejki
podstawień. Są one albo ujmowane w klamry, albo ich proces
podstawiania zmiennych i komend daje liczby i łańcuchy, nie
wymagające podstawień jako takich. Jednak z uwagi na to,
że nieuklamrowione wyrażenia wymagają dwóch rund
podstawień, kompilator kodu bitowego musi emitować dodatkowe
instrukcje obsługi takiej sytuacji. Najkosztowniejszy kod generowany
jest dla nieuklamrowionych wyrażeń, które
zawierają podstawienia komend. Wyrażenia te muszą
być implementowane przez generowanie nowego kodu za każdym
wykonaniem wyrażenia.
SŁOWA KLUCZOWE¶
arytmetyka, logiczny, porównanie, wyrażenie, porównanie
rozmyte
Powyższe tłumaczenie pochodzi z nieistniejącego już
Projektu Tłumaczenia Manuali i
może nie być
aktualne. W razie zauważenia różnic między
powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub
funkcji, prosimy o zapoznanie się z oryginalną
(angielską) wersją strony podręcznika za pomocą
polecenia:
- man --locale=C 3tcl expr
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.