Linux / Unix команда: expr

име

expr - Оценявайте израз

резюме

expr arg ? арг арг ... ?

Съкращава arg (добавя се разделителни интервали между тях), оценява резултата като израз Tcl и връща стойността. Операторите, разрешени в Tcl изразите, са подгрупа от операторите, разрешени в изразите С, и те имат същото значение и приоритет като съответните C оператори. Изразите почти винаги водят до цифрови резултати (цели числа или стойности с плаваща запетая). Например, изразът

expr 8.2 + 6

оценява на 14.2. Изразите Tcl се различават от изразите C по начина, по който са определени операндите. Също така, изразът Tcl поддържа не-цифрови операнди и сравнения на низове.

операнди

Изразът Tcl се състои от комбинация от операнди, оператори и скоби. Може да се използва бяло пространство между операндите и операторите и скобите; тя се игнорира от инструкциите на израза. Когато е възможно, операндите се интерпретират като цели стойности. Цифровите стойности могат да се задават в десетичната (нормалната), в осмична (ако първият знак на операнда е 0 ) или в шестнадесетичен (ако първите два знака на операнда са 0x ). Ако операндът няма един от формите на цялото число, дадени по-горе, тогава той се третира като номер с плаваща запетая, ако това е възможно. Номерата с плаваща запетая могат да се задават по който и да е от начините, приети от компилатора съвместим с ANSI (с изключение на това, че при повечето инсталации няма да бъдат разрешени суфиксите f , F , l и L ). Например, всички от следните са валидни номера с плаваща запетая: 2.1, 3., 6e4, 7.91e + 16. Ако не е възможно числено тълкуване, тогава операндът остава като низ (и може да се приложи само ограничен набор от оператори).

Операндите могат да се задават по един от следните начини:

[1]

Като цифрова стойност, или цяло число или плаваща точка.

[2]

Като променлива Tcl, използвайки стандартната $ notation. Стойността на променливата ще се използва като операнд.

[3]

Като низ, заграден в двойни кавички. Експресиращият израз ще извърши замествания на обратна наклонена черта, променлива и команда на информацията между цитатите и ще използва резултантната стойност като операнд

[4]

Като низ, заграден в скоби. Героите между отворената скоба и съответната близка скоба ще бъдат използвани като операнд без никакви замествания.

[5]

Като команда Tcl затворена в скоби. Командата ще бъде изпълнена и нейният резултат ще бъде използван като операнд.

[6]

Като математическа функция, чиито аргументи имат някоя от горните форми за операнди, като грях ($ x) . Вижте по-долу списък с определени функции.

Когато заместванията се появяват по-горе (напр. В цитираните низове), те се изпълняват от инструкциите на израза. Възможно е обаче допълнителният слой за заместване да е бил изпълнен от командния анализатор преди извикването на процесора на израза. Както е обсъдено по-долу, обикновено е най-добре да включите изрази в скоби, за да предотвратите командния анализатор да извършва замествания върху съдържанието.

За някои примери за прости изрази, предположим, че променливата a има стойност 3, а променливата b има стойност 6. Тогава командата отляво на всеки от линиите по-долу ще доведе до стойността от дясната страна на линията:

изписване 3.1 + $ a6.1 изтр. 2 + "$ a. $ b" 5.6 експрес 4 * [дължина "6 2"] 8 експре {{дума едно} <"дума $ a"} 0

Операторите

Валутните оператори са изброени по-долу, групирани в низходящ ред:

- + ~!

Unary минус, unary плюс, bit-мъдър НЕ, логически НЕ. Нито един от тези операнди не може да бъде приложен към низови операнди, а битово не може да се прилага само към числа.

* /%

Умножете, разделете, останете. Нито един от тези операнди не може да бъде приложен към низови операнди, а остатъкът може да бъде приложен само към числа. Остатъкът винаги ще има същия знак като делителя и абсолютна стойност по-малка от делителя.

+ -

Добавяне и изваждане. Валиден за всички числови операнди.

<< >>

Ляво и дясно смяна. Валиден само за цели операнди. Десният превключвател винаги разпространява знака.

<> <=>

Булева по-малка, по-голяма, по-малка или равна, по-голяма или равна. Всеки оператор произвежда 1, ако условието е вярно, 0 в противен случай. Тези оператори могат да се прилагат към низове, както и цифрови операнди, в който случай се използва сравняване на низове.

==! =

Boolean равен и не е равен. Всеки оператор произвежда нула / един резултат. Валиден за всички типове операнди.

&

Бит-мъдър И. Валиден само за цели операнди.

^

Бит-мъдър изключителен OR. Валиден само за цели операнди.

|

Бит-мъдър ИЛИ. Валиден само за цели операнди.

&&

Логически И. Произвежда 1 резултат, ако и двата операнда са различни от 0, в противен случай. Валидни само за булеви и цифрови (цели числа или плаваща запетая).

||

Логически OR. Произвежда 0 резултат, ако и двата операнда са нула, 1 иначе. Валидни само за булеви и цифрови (цели числа или плаваща запетая).

х ? y : z

Ако-тогава-друг, както и в C. Ако x се оценява до ненулева, тогава резултатът е стойността на y . В противен случай резултатът е стойността на z . Оперативът x трябва да има цифрова стойност.

Вижте ръководството C за повече подробности относно резултатите, получени от всеки оператор. Всички двоични оператори се групират от ляво на дясно в същото ниво на приоритет. Например командата

expr 4 * 2 <7

връща 0.

В && , || , и ?: операторите имат "мързелива оценка", точно както в C, което означава, че операндите не се оценяват, ако те не са необходими за определяне на резултата. Например в командата

expr {$ v? [а]: [b]

само една от [a] или [b] действително ще бъде оценена, в зависимост от стойността на $ v . Имайте предвид обаче, че това е вярно само ако целият израз е затворен в скоби; в противен случай Tcl анализаторът ще оцени както [a], така и [b] преди да извика командата expr .

Математически функции

Tcl поддържа следните математически функции в изрази:

абсолютният коефициент на интензитета на двойното дъно log10 сумата на експорта на тен атана на пода ренд тан на atan2 fmod кръг таван hypot sin cos int sinh

абс ( арг )

Връща абсолютната стойност на arg . Arg може да бъде цяло число или floating-point, а резултатът се връща в същата форма.

acos ( arg )

Връща arc косинуса на arg , в обхвата [0, pi] radians. Arg трябва да бъде в диапазона [-1,1].

asin ( arg )

Връща аргинния синус на arg , в диапазона [-pi / 2, pi / 2]. Arg трябва да бъде в диапазона [-1,1].

atan ( arg )

Връща дъговата допирателна на arg , в диапазона [-pi / 2, pi / 2].

atan2 ( х, у )

Връща дъговата тангенс на y / x в диапазона [-pi, pi] radians. x и y не могат да бъдат 0.

ceil ( arg )

Връща най-малката цяло число не по-малко от арг .

cos ( arg )

Връща косинуса на arg , измерен в радиани.

cosh ( arg )

Връща хиперболичния косинус на arg . Ако резултатът ще доведе до преливане, се връща грешка.

двойно ( арг )

Ако arg е плаваща стойност, връща arg , в противен случай конвертира arg към floating и връща конвертираната стойност.

exp ( arg )

Връща експоненциалния на arg , дефиниран като e ** arg . Ако резултатът ще доведе до преливане, се връща грешка.

етаж ( арг )

Връща най-голямата интегрална стойност не по-голяма от arg .

fmod ( х, у )

Връща остатъка с плаваща запетая на разделянето на x с y . Ако y е 0, връща се грешка.

хипо ( x, y )

Изчислява дължината на хипотенузата на правоъгълния триъгълник ( x * x + y * y ).

int ( arg )

Ако arg е цяло число, връща arg , в противен случай конвертира arg към цяло число чрез срязване и връща конвертираната стойност.

log ( arg )

Връща естествения логаритъм на arg . Arg трябва да бъде положителна стойност.

log10 ( arg )

Връща основния 10 логаритъм на arg . Arg трябва да бъде положителна стойност.

pow ( x, y )

Изчислява стойността на x издигната до мощността y . Ако x е отрицателен, у трябва да е цяло число.

ранд ()

Връща число с плаваща запетая от нула до малко по-малко от едно или, по математически начин, диапазон [0,1]. Семената идват от вътрешния часовник на машината или могат да бъдат настроени ръчно с функцията Srand.

кръг ( arg )

Ако arg е цяло число, връща arg , в противен случай конвертира arg към цяло число чрез закръгляване и връща конвертираната стойност.

грях ( арг )

Връща синусите на arg , измерени в радиани.

sinh ( arg )

Връща хиперболичния синус на arg . Ако резултатът ще доведе до преливане, се връща грешка.

sqrt ( arg )

Връща квадратния корен на arg . Arg не трябва да е отрицателен.

srand ( arg )

Arg , който трябва да е цяло число, се използва за нулиране на семена за генератора на случайни числа. Връща първото произволно число от това семе. Всеки преводач има собствено семе.

tan ( arg )

Връща допирателната на arg , измерена в радиани.

танх ( арг )

Връща хиперболичното тангенс на arg .

В допълнение към тези предварително дефинирани функции, приложенията могат да дефинират допълнителни функции, като използват Tcl_CreateMathFunc ().

Видове, преливане и прецизност

Всички вътрешни изчисления, включващи числа, се правят с тип C дълъг , а всички вътрешни изчисления, включващи плаваща точка, се извършват с двоен тип C. При конвертиране на низ в плаваща запетая се установява препълване на експонента и води до Tcl грешка. За преобразуване до цяло число от низ, откриването на преливане зависи от поведението на някои рутинни процедури в местната библиотека C, така че трябва да се счита за ненадеждна. Във всеки случай, цялостният преливник и понижено ниво обикновено не се установяват надеждно за междинни резултати. Преливането и подреждането на плаваща запетая се откриват до степента, поддържана от хардуера, което обикновено е доста надеждно.

Преобразуването между вътрешните представяния за цели числа, числа с плаваща запетая и низове се извършва автоматично според нуждите. За аритметични изчисления се използват цели числа, докато се въведе номер с плаваща запетая, след което се използва плаваща точка. Например,

expr 5/4

връща 1, докато

expr 5 / 4.0 expr 5 / ([дължина на редицата "abcd"] + 0.0)

и двете връщат 1.25. Стойностите на плаваща запетая винаги се връщат с "` . '' или e, така че те да не изглеждат като цели стойности. Например,

expr 20.0 / 5.0

връща 4.0 , а не 4 .

Струнни операции

Стойностите на низовете могат да се използват като операнди на операторите за сравнение, въпреки че оценяващият израз се опитва да направи сравнения като цяло число или плаваща точка, когато може. Ако единият от операндите на сравнението е низ и другият има цифрова стойност, цифровият операнд се преобразува обратно в низ с помощта на спецификатора за формат C на спринт форма % d за числа и % g за стойностите с плаваща точка. Например командите

expr {"0x03"> "2"} expr {"0y" <"0x12"}

и двете връщат 1. Първото сравнение се прави с помощта на цяло число сравнение, а второто се извършва чрез сравняване на низовете, след като вторият операнд се преобразува в низ 18 . Поради тенденцията на Tcl да третира стойностите като числа, когато това е възможно, обикновено не е добра идея да използвате оператори като ==, когато наистина искате сравняване на низове и стойностите на операндите да са произволни; в тези случаи е по-добре да се използва командата низ .

Съображения за ефективността

Приложете изрази в скоби за най-добра скорост и най-малките изисквания за съхранение. Това позволява на Tcl bytecode компилатора да генерира най-добрия код.

Както бе споменато по-горе, изразите се заместват два пъти: веднъж с Tcl анализатора и веднъж с командата expr . Например командите

задайте 3 серии b {$ a + 2} expr $ b * 4

връщането 11, а не кратно на 4. Това е така, защото Tcl анализаторът първо ще замести $ a + 2 за променливата b , тогава командата expr ще оцени израза $ a + 2 * 4 .

Повечето изрази не изискват втори кръг от замествания. Или те са затворени в скоби, или, ако не, техните променливи и командни замествания дават числа или струни, които сами по себе си не изискват подмяна. Въпреки това, тъй като няколко неуловими израза се нуждаят от два кръга замествания, компилаторът на bytecode трябва да издава допълнителни инструкции, за да се справи с тази ситуация. Най-скъпият код е необходим за невъоръжени изрази, които съдържат замествания на команди. Тези изрази трябва да бъдат изпълнени чрез генериране на нов код всеки път, когато изразът се изпълнява.

Ключови думи

аритметично, булево , сравни, израз, размито сравнение

Важно: Използвайте командата човек ( % man ), за да видите как се използва команда на вашия компютър.