Imię
expr - oceń wyrażenie
Streszczenie
expr arg ? arg arg … ?
Łączone arg (dodając odstępy między nimi), ocenia wynik jako wyrażenie Tcl i zwraca wartość. Operatory dozwolone w wyrażeniach Tcl są podzbiorem operatorów dozwolonych w wyrażeniach C i mają to samo znaczenie i pierwszeństwo, co odpowiadające im operatory C. Wyrażenia prawie zawsze dają wyniki numeryczne (wartości całkowite lub zmiennoprzecinkowe). Na przykład wyrażenie
wyrażenie 8,2 + 6
ocenia do 14.2. Wyrażenia Tcl różnią się od wyrażeń C w sposób określony przez operandy. Ponadto wyrażenia Tcl obsługują nieliczbowe operandy i porównania łańcuchów.
Operandy
Wyrażenie Tcl składa się z kombinacji operandów, operatorów i nawiasów. Pomiędzy operandami a operatorami i nawiasami można używać białych znaków; jest ignorowane przez instrukcje wyrażenia. Tam, gdzie to możliwe, operandy są interpretowane jako wartości całkowite. Wartości całkowite mogą być podawane w systemie dziesiętnym (normalny przypadek), w ósemkowym (jeśli pierwszym znakiem jest operand0) lub w systemie szesnastkowym (jeśli pierwsze dwa znaki argumentu to0x). Jeśli operand nie ma jednego z podanych wyżej formatów całkowitych, wówczas jest to traktowane jako liczba zmiennoprzecinkowa, o ile jest to możliwe. Liczby zmiennoprzecinkowe mogą być określone na jeden ze sposobów akceptowanych przez kompilator C zgodny z ANSI (z wyjątkiem tego, żefa, fa, l, iL sufiksy nie będą dozwolone w większości instalacji). Na przykład, wszystkie poniższe są poprawnymi liczbami zmiennoprzecinkowymi: 2.1, 3., 6e4, 7.91e + 16. Jeśli żadna interpretacja numeryczna nie jest możliwa, argument jest pozostawiony jako ciąg (można do niego zastosować tylko ograniczony zestaw operatorów).
Argumenty operacyjne można określić w jeden z następujących sposobów:
1
Jako wartość liczbowa, całkowita lub zmiennoprzecinkowa.
2
Jako zmienną Tcl, używając standardu$ notacja. Wartość zmiennej zostanie wykorzystana jako operand.
3
Jako ciąg zawarty w podwójnych cudzysłowach. Analizator wyrażeń będzie wykonywał odwrotne ukośniki, zmienne i podstawienia komend na podstawie informacji między cudzysłowami i użyje wartości wynikowej jako argumentu
4
Jako ciąg zamknięty w nawiasach klamrowych. Znaki między klamrą otwartą a pasującą klamrą zamykającą będą używane jako operand bez żadnych podstawień.
5
Jako polecenie Tcl ujęte w nawiasy kwadratowe. Polecenie zostanie wykonane, a jego wynik zostanie użyty jako operand.
6
Jako funkcja matematyczna, której argumenty mają jedną z powyższych postaci dla operandów, takich jaksin ($ x). Poniżej znajduje się lista zdefiniowanych funkcji.
Tam, gdzie występują substytucje (np. Wewnątrz cytowanych ciągów), są one wykonywane według instrukcji wyrażenia. Jednak dodatkowa warstwa podstawiania mogła już zostać wykonana przez analizator składni przed wywołaniem procesora wyrażeń. Jak omówiono poniżej, zwykle najlepiej jest zamykać wyrażenia w nawiasach klamrowych, aby uniemożliwić analizatorowi parser wykonywanie podstawień na zawartości.
W przypadku niektórych przykładów prostych wyrażeń przyjmijmy zmiennąza ma wartość 3 i zmiennąbma wartość 6. Następnie polecenie po lewej stronie każdej z poniższych linii wyświetli wartość po prawej stronie linii:
wyrażenie 3.1 + $ a6.1 wyrażenie 2 + "$ a. $ b" 5,6 wyrażenie 4 * długość słowa "6 2" 8 wyrażenie {{słowo}} <"słowo $ a"} 0
Operatorzy
Prawidłowe operatory są wymienione poniżej, pogrupowane według malejącej kolejności:
- + ~ !
Jednoargumentowy minus, jednoargumentowy plus, bitowy NOT, logiczny NIE. Żaden z tych argumentów nie może być zastosowany do operandów łańcuchowych, a bitowy NOT może być zastosowany tylko do liczb całkowitych.
* / %
Mnożenie, dzielenie, pozostawanie. Żaden z tych argumentów nie może być zastosowany do operandów łańcuchowych, a reszta może być zastosowana tylko do liczb całkowitych. Reszta zawsze będzie miała ten sam znak co dzielnik i wartość bezwzględną mniejszą od dzielnika.
+ -
Dodaj i odejmij. Obowiązuje dla dowolnych operacji numerycznych.
<< >>
Przesunięcie w lewo i w prawo. Dotyczy tylko operandów całkowitych. Prawe przesunięcie zawsze propaguje bit znaku.
< > <= >=
Wartość logiczna mniejsza, większa, mniejsza lub równa, i większa lub równa. Każdy operator tworzy 1, jeśli warunek jest prawdziwy, 0 w przeciwnym razie. Operatory te mogą być stosowane zarówno do łańcuchów, jak i operandów numerycznych, w którym to przypadku stosuje się porównywanie łańcuchów.
== !=
Boolean równa i nie równa. Każdy operator daje wynik zero / jeden. Obowiązuje dla wszystkich typów operandów.
&
Bitowo AND. Dotyczy tylko operandów całkowitych.
^
Bit-exclusive exclusive OR. Dotyczy tylko operandów całkowitych.
|
Bitowo OR. Dotyczy tylko operandów całkowitych.
&&
Logiczne AND. Tworzy wynik 1, jeśli oba operandy są niezerowe, 0 w przeciwnym razie. Dotyczy tylko operandów logicznych i liczbowych (liczb całkowitych lub zmiennoprzecinkowych).
||
Logiczna OR. Tworzy wynik 0, jeśli oba operandy są równe zero, 1 w przeciwnym razie. Dotyczy tylko operandów logicznych i liczbowych (liczb całkowitych lub zmiennoprzecinkowych).
x ? y : z
If-then-else, jak w C. If x oblicza wartość niezerową, a wynikiem jest wartość y . W przeciwnym razie wynikiem jest wartość z . The x operand musi mieć wartość liczbową.
Zobacz podręcznik C, aby uzyskać więcej szczegółowych informacji na temat wyników uzyskanych przez każdego operatora. Wszyscy operatorzy binarni grupują się od lewej do prawej na tym samym poziomie priorytetu. Na przykład polecenie
wyrażenie 4 * 2 <7
zwraca 0.
The&&, ||, i?: operatorzy mają "leniwą ocenę", podobnie jak w C, co oznacza, że operandy nie są oceniane, jeśli nie są potrzebne do ustalenia wyniku. Na przykład w komendzie
expr {$ v? a: b}
tylko jeden zza lubb będą faktycznie oceniane, w zależności od wartości$ v. Należy jednak zauważyć, że jest to prawdziwe tylko wtedy, gdy całe wyrażenie jest ujęte w nawiasy klamrowe; w innym przypadku parser Tcl oceni obaza ib przed wywołaniemexpr dowództwo.
Funkcje matematyczne
Tcl obsługuje następujące funkcje matematyczne w wyrażeniach:
abs pałkalogsqrt acos podwójnielog10srand jak w exppowdębnik atan podłogaskrajtanh atan2 fmodokrągły stropować hipotezagrzech sałata intsinh
abs ( arg )
Zwraca bezwzględną wartość arg . Arg może być liczbą całkowitą lub zmiennoprzecinkową, a wynik jest zwracany w tej samej formie.
acos ( arg )
Zwraca cosinus łukowy z arg , w zakresie 0, pi radians. Arg powinien znajdować się w przedziale -1,1.
jak w( arg )
Zwraca sinus z arg , w zakresie -pi / 2, pi / 2 radians. Arg powinien znajdować się w przedziale -1,1.
atan ( arg )
Zwraca styczną łuku arg , w zakresie -pi / 2, pi / 2 radians.
atan2 ( x, y )
Zwraca styczną łuku y / x , w zakresie -pi, pi radians. x i y nie może mieć wartości 0.
stropować( arg )
Zwraca najmniejszą liczbę całkowitą nie mniej niż arg .
sałata( arg )
Zwraca cosinus z arg mierzone w radianach.
pałka( arg )
Zwraca cosinus hiperboliczny z arg . Jeśli wynik spowodowałby przepełnienie, zwracany jest błąd.
podwójnie( arg )
Jeśli arg jest wartością zmiennoprzecinkową, zwraca arg , w przeciwnym razie konwertuje arg do floating i zwraca skonwertowaną wartość.
exp ( arg )
Zwraca wykładniczy z arg , zdefiniowany jako e ** arg . Jeśli wynik spowodowałby przepełnienie, zwracany jest błąd.
podłoga( arg )
Zwraca największą całkowitą wartość nie większą niż arg .
fmod ( x, y )
Zwraca pozostałą część kropki podziału x przez y . Jeśli y ma wartość 0, zwracany jest błąd.
hypot ( x, y )
Oblicza długość przeciwprostokątnej trójkąta prostokątnego ( x * x + y * y ).
int ( arg )
Jeśli arg jest wartością całkowitą, zwraca arg , w przeciwnym razie konwertuje arg do liczby całkowitej przez obcięcie i zwraca wartość przekonwertowaną.
log( arg )
Zwraca logarytm naturalny z arg . Arg musi być wartością dodatnią.
log10 ( arg )
Zwraca logarytm podstawowy 10 arg . Arg musi być wartością dodatnią.
pow ( x, y )
Oblicza wartość x podniesiony do władzy y . Jeśli x jest ujemny, y musi być wartością całkowitą.
skraj()
Zwraca liczbę zmiennoprzecinkową od zera do zaledwie mniejszej niż jeden lub, z matematycznego punktu widzenia, z zakresu 0,1. Nasiona pochodzą z wewnętrznego zegara urządzenia lub mogą być ustawione ręcznie za pomocą funkcji srand.
okrągły( arg )
Jeśli arg jest wartością całkowitą, zwraca arg , w przeciwnym razie konwertuje arg do liczby całkowitej przez zaokrąglenie i zwraca wartość przekonwertowaną.
grzech( arg )
Zwraca sinus arg mierzone w radianach.
sinh ( arg )
Zwraca sinus hiperboliczny arg . Jeśli wynik spowodowałby przepełnienie, zwracany jest błąd.
sqrt ( arg )
Zwraca pierwiastek kwadratowy z arg . Arg musi być nieujemny.
srand ( arg )
The arg , która musi być liczbą całkowitą, służy do resetowania materiału początkowego generatora liczb losowych. Zwraca pierwszą losową liczbę z tego nasiona. Każdy tłumacz ma własne nasiono.
dębnik( arg )
Zwraca styczną z arg mierzone w radianach.
tanh ( arg )
Zwraca styczną hiperboliczną arg .
Oprócz tych wstępnie zdefiniowanych funkcji aplikacje mogą definiować dodatkowe funkcje za pomocąTcl_CreateMathFunc().
Typy, przepełnienie i precyzja
Wszystkie wewnętrzne obliczenia dotyczące liczb całkowitych są wykonywane za pomocą typu C długie , a wszystkie wewnętrzne obliczenia obejmujące zmiennoprzecinkowe są wykonywane przy użyciu typu C. podwójnie . Podczas konwertowania ciągu znaków na zmiennoprzecinkowe wykrywane jest przekroczenie wykładnika i powoduje błąd Tcl. W przypadku konwersji na liczbę całkowitą z łańcucha, wykrycie przepełnienia zależy od zachowania niektórych procedur w lokalnej bibliotece C, więc należy je uznać za niewiarygodne. W każdym przypadku przepełnienie i niedomiar całkowity zazwyczaj nie są wykrywane w sposób wiarygodny w przypadku wyników pośrednich. Przepełnienie i niedomiar zmiennoprzecinkowy są wykrywane do poziomu obsługiwanego przez sprzęt, który jest ogólnie dość niezawodny.
Konwersja pomiędzy wewnętrznymi reprezentacjami dla liczb całkowitych, zmiennoprzecinkowych i operandów łańcuchowych jest wykonywana automatycznie w razie potrzeby. W przypadku obliczeń arytmetycznych liczby całkowite są używane, dopóki nie zostanie wprowadzona liczba zmiennoprzecinkowa, po której zostanie użyty zmiennoprzecinkowy. Na przykład,
expr 5/4
zwraca 1, gdy
wyrażenie 5 / 4.0 wyrażenie 5 / (długość łańcucha "abcd" + 0.0)
obie zwracają 1,25. Wartości zmiennoprzecinkowe są zawsze zwracane za pomocą ``."lubmi aby nie wyglądały jak wartości całkowite. Na przykład,
wyraż 20,0 / 5,0
zwraca4.0, nie4.
Operacje na łańcuchach
Wartości ciągów mogą być używane jako operandy operatorów porównania, chociaż ewaluator wyrażeń próbuje wykonać porównania jako liczbę całkowitą lub zmiennoprzecinkową, gdy tylko może. Jeśli jednym z argumentów porównania jest ciąg znaków, a drugi ma wartość liczbową, operand numeryczny jest przekształcany z powrotem w ciąg znaków za pomocą C sprintf specyfikator formatu%re dla liczb całkowitych i%sol dla wartości zmiennoprzecinkowych. Na przykład polecenia
expr {"0x03"> "2"} expr {"0y" <"0x12"}
oba zwracają 1. Pierwsze porównanie jest wykonywane przy użyciu porównania liczb całkowitych, a drugie jest wykonywane przy użyciu porównania ciągów po drugim operandzie jest konwertowane na ciąg znaków18. Ze względu na tendencję Tcl do traktowania wartości jako liczb, ilekroć jest to możliwe, nie jest dobrym pomysłem korzystanie z operatorów takich jak==kiedy naprawdę chcesz porównać łańcuch, a wartości operandów mogą być arbitralne; w takich przypadkach lepiej jest używaćstrunowy zamiast tego polecenie.
Rozważania dotyczące wydajności
Uporządkuj wyrażenia w nawiasach klamrowych, aby uzyskać najlepszą szybkość i najmniejsze wymagania dotyczące przestrzeni dyskowej. Dzięki temu kompilator kodu bajtowego Tcl może wygenerować najlepszy kod.
Jak wspomniano powyżej, wyrażenia są podstawione dwa razy: raz przez parser Tcl i raz przez expr dowództwo. Na przykład polecenia
ustaw 3 ustaw b {$ a + 2} expr $ b * 4
return 11, a nie wielokrotność 4. Dzieje się tak dlatego, że parser Tcl najpierw zastąpi$ a + 2 dla zmiennejb, a późniejexpr Polecenie oceni wyrażenie$ a + 2 * 4.
Większość wyrażeń nie wymaga drugiej rundy podstawień. Albo są one zamknięte w nawiasy klamrowe, albo, jeśli nie, ich zmienne i podstawienia komendy dają liczby lub łańcuchy, które same nie wymagają podstawień. Jednakże, ponieważ kilka niezadekłanych wyrażeń wymaga dwóch rund podstawień, kompilator kodu bajtowego musi emitować dodatkowe instrukcje, aby poradzić sobie z tą sytuacją. Najdroższy kod jest wymagany w przypadku nieujawnionych wyrażeń, które zawierają podstawienia komend. Wyrażenia te należy implementować, generując nowy kod za każdym razem, gdy wykonywane jest wyrażenie.
Słowa kluczowe
arytmetyka, boolean, porównywanie, ekspresja, porównanie rozmyte
Ważny: Użyj mężczyzna dowództwo ( % mężczyzna ), aby zobaczyć, jak polecenie jest używane na danym komputerze.




