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/.