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

Име

expr - Оцени израз

Синопсис

expr arg ? arg arg ... ?

Конкатира аргумент (додавајќи одделени простори помеѓу нив), го оценува резултатот како Tcl израз и ја враќа вредноста. Операторите дозволени во Tcl изразите се подмножество на операторите дозволени во C изрази, и тие го имаат истото значење и предност како соодветните 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, со користење на стандардна $ нотација. Вредноста на променливата ќе се користи како операнд.

[3]

Како низа затворена во двојни цитати. Парсерот за израз ќе изврши обратска коса црта, променлива и команда за замена на информациите помеѓу цитатите, и користете ја добиената вредност како операнд

[4]

Како низа затворена во загради. Карактерите помеѓу отворената заграда и соодветната заграда ќе се користат како операнд без никакви замени.

[5]

Како Tcl команда заградена во загради. Командата ќе биде извршена и нејзиниот резултат ќе се користи како операнд.

[6]

Како математичка функција чии аргументи имаат некоја од горенаведените форми за операнди, како што е грев ($ x) . Погледнете подолу за листа на дефинирани функции.

Каде се извршуваат заменувањата погоре (на пр. Во цитираните низи), тие се изведуваат со инструкциите на изразот. Сепак, дополнителниот слој на замена можеби веќе бил извршен од парсерот за команда пред да се повика изворниот процесор. Како што е дискутирано подолу, обично е најдобро да се приложи експреси во загради за да се спречи парсерот на командата да врши замена на содржината.

За некои примери на едноставни изрази, претпоставиме дека променливата a ја има вредноста 3, а променливата b ја има вредноста 6. Тогаш командата од левата страна на секоја од редовите подолу ќе ја произведе вредноста на десната страна од редот:

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * [l "length" 6 2 "] 8 expr {{word one} <" word $ a "} 0

Оператори

Валидните оператори се наведени подолу, групирани во опаѓачки редослед:

- + ~!

Унарниот минус, унарниот плус, бит-НЕ, логично НЕ. Ниту еден од овие операнди не може да се примени на низа операнди, а бит-НЕ може да се примени само на цели броеви.

* /%

Множете се, подели, остаток. Ниту еден од овие операнди не може да се примени на низа операнди, а остатокот може да се примени само за цели броеви. Остатокот секогаш ќе има ист знак како делител и апсолутна вредност помала од делителята.

+ -

Додај и одземе. Валиден за сите нумерички операнди.

<< >>

Лево и десно поместување. Важи само за целобројни операнди. Правото поместување секогаш го пропагира знакот.

<> <=> =

Булова е помала, поголема, помала или еднаква, и поголема од или еднаква. Секој оператор произведува 1 ако состојбата е точна, 0 поинаку. Овие оператори може да се применат за низи, како и нумерички операнди, во кој случај се користи компаративна низа.

==! =

Булова е еднаква и не е еднаква. Секој оператор произведува нула / еден резултат. Валидна за сите типови операнди.

& &

Бит-мудар И. Важи само за целобројни операнди.

^

Бит-мудар исклучиво ИЛИ. Важи само за целобројни операнди.

|

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

&&

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

||

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

x ? y : z

Ако-тогаш-друго, како во C. Ако x евалуира на не-нула, тогаш резултатот е вредноста на y . Инаку, резултатот е вредноста на z . X операндот мора да има нумеричка вредност.

Погледнете го прирачникот C за повеќе детали за резултатите произведени од секој оператор. Сите бинарни оператори се групираат од лево кон десно во рамките на истото ниво на приоритет. На пример, командата

expr 4 * 2 <7

се враќа 0.

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

expr {$ v? [a]: [b]}

само еден од [a] или [b] всушност ќе биде оценет, во зависност од вредноста на $ v . Забележете, сепак, дека ова е точно само ако целиот израз е затворен во загради; во спротивно, парсерот Tcl ќе ги процени и [a] и [b] пред да се повика на командата expr .

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

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

abs cosh log log sqrt агол двоен лог10 спр ацт ацт тхе тхан тхан тхан тхан атан2 фмд круг цеп хипо син инс син синх

abs ( arg )

Ја враќа апсолутната вредност на arg . Arg може да биде или целобројна или подвижна точка, а резултатот се враќа во истата форма.

acos ( arg )

Го враќа лак косинусот на arg , во опсегот [0, pi] радијани. Arg треба да биде во опсег [-1,1].

асин ( arg )

Го враќа лак синусот на arg , во опсегот [-pi / 2, pi / 2] радијани. Arg треба да биде во опсег [-1,1].

атан ( arg )

Ја враќа лак тангентата на arg , во опсегот [-pi / 2, pi / 2] радијани.

atan2 ( x, y )

Ја враќа тангентата на лакот на y / x , во опсегот [-pi, pi] радијани. x и y не може да биде 0.

ceil ( arg )

Ја враќа најмалата целобројна вредност не помала од arg .

cos ( arg )

Го враќа косинусот на аргументот , мерено во радијани.

cosh ( arg )

Го враќа хиперболичниот косинус на arg . Ако резултатот ќе предизвика прелевање, се враќа грешка.

двоен ( arg )

Ако arg е лебдечка вредност, се враќа аргументот , инаку конвертира аргументот да лебди и ја враќа конвертираната вредност.

exp ( arg )

Го враќа експоненцијалот на arg , дефиниран како e ** arg . Ако резултатот ќе предизвика прелевање, се враќа грешка.

кат ( arg )

Ја враќа најголемата интегрална вредност што не е поголема од arg .

fmod ( x, y )

Го враќа остатокот од подвижната точка од поделбата на x за y . Ако y е 0, се враќа грешка.

хипот ( x, y )

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

int ( arg )

Ако arg е целобројна вредност, се враќа arg , инаку конвертира аргумент во цел број со скратување и ја враќа конвертираната вредност.

најавите ( arg )

Го враќа природниот логаритам на arg . Arg мора да биде позитивна вредност.

log10 ( arg )

Го враќа основниот 10 логаритам на arg . Arg мора да биде позитивна вредност.

pow ( x, y )

Ја пресметува вредноста на x издигната на моќноста y . Ако x е негативен, y мора да биде целобројна вредност.

rand ()

Го враќа бројот со подвижна запирка од нула до само помалку од една или, во математички термини, опсегот [0,1). Семето доаѓа од внатрешниот часовник на машината или може да се постави прирачник со функцијата srand.

круг ( arg )

Ако arg е целобројна вредност, се враќа arg , инаку конвертира аргумент во цел број со заокружување и ја враќа конвертираната вредност.

грев ( arg )

Го враќа синусот на аргументот , мерено во радијани.

sinh ( arg )

Го враќа хиперболичкиот синус на аргументот . Ако резултатот ќе предизвика прелевање, се враќа грешка.

sqrt ( arg )

Го враќа квадратниот корен на arg . Arg мора да биде не-негативен.

srand ( arg )

Arg , кој мора да биде цел број, се користи за ресетирање на семето за генераторот на случаен број. Го враќа првиот случајен број од тоа семе. Секој преведувач има своја семе.

тен ( arg )

Ја враќа тангентата на arg , мерена во радијани.

tanh ( 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 .

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

Вредностите на стрингот може да се користат како операнди на операторите за споредба, иако оценувачот на изразот се обидува да направи споредби како целобројни или подвижни точки кога може. Ако еден од операндите за споредба е низа, а другиот има нумеричка вредност, нумеричкиот операнд се претвора назад во низа користејќи спецификатор на формат sprintf формат % 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 .

Повеќето изрази не бараат втор круг замени. Или тие се затворени со загради или, ако не, нивните променливи и командни замени даваат бројки или низи кои самите не бараат замена. Меѓутоа, бидејќи на неколку неизградени изрази се потребни два круга на заменувања, компајлерот на бајкод мора да испушти дополнителни инструкции за справување со оваа ситуација. Најскапиот код е потребен за неискажани изрази кои содржат командни замени. Овие изрази мора да се имплементираат со генерирање на нов код секогаш кога изразот е извршен.

Клучни зборови

аритметичка, логичка , споредлива, изразувачка, нејасна споредба

Важно: Користете ја командата за човекот ( % man ) за да видите како се користи командата на вашиот компјутер.