Линук / Уник наредба: екпр

Име

екпр - Оцените израз

Синопсис

екпр арг ? арг арг ... ?

Цонцатенатес арг (додавање размака између њих), процењује резултат као израз Тцл и враћа вредност. Оператери дозвољени у Тцл изразима су подскуп оператера дозвољених у Ц изразима, а имају исто значење и предност као одговарајући Ц оператери. Изрази скоро увек дају нумеричке резултате (вредности цијелог или плутајуће тачке). На пример, израз

екпр 8.2 + 6

оцењује на 14.2. Тцл изрази се разликују од Ц израза на начин на који су наведени операнди. Такође, Тцл изрази подржавају не-нумеричке операнде и упоређивања стрингова.

Операнде

Тцл израз се састоји од комбинације операнди, оператора и заграда. Бијели простор се може користити између операнда и оператора и заграда; то се занемарује упутствима израза. Гдје је могуће, операнди се тумаче као цијели вриједности. Вредности цијелог броја могу бити специфициране у децималном (нормални случај), у окталном (ако је први карактер операнда 0 ), или у хексадецималном (ако су прва два карактера операнда ). Ако операнд нема један од интегралних формата датих горе, онда се третира као број са плутајућим тачком ако је то могуће. Бројеви са плутајућим тачкама могу бити наведени на било који од начина прихваћених од стране АНСИ-компатибилног Ц-компајлера (осим што су ф , Ф , л и Л суфикс неће бити дозвољени у већини инсталација). На пример, сви од следећих су важећи бројеви са плутајућим тачкама: 2.1, 3., 6е4, 7.91е + 16. Ако ниједно нумеричко тумачење није могуће, операнд се оставља као низ (и може се примијенити само ограничен скуп оператора).

Операнде могу бити специфициране на било који од следећих начина:

[1]

Као нумеричка вриједност, целовита или плутајућа тачка.

[2]

Као променљива Тцл, користећи стандардну нотацију. Вредност варијабле ће се користити као операнд.

[3]

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

[4]

Као низ у ограду. Ликови између отворене нараменице и одговарајуће бленде се користе као операнд без икаквих замена.

[5]

Као команда Тцл приложена у заградама. Команда ће се извршити и њен резултат ће се користити као операнд.

[6]

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

Тамо где се изнова појављују супституције (нпр. Унутар цитираних низова), оне се обављају помоћу израза. Међутим, додатни слој супституције је можда већ извршио командни анализатор пре него што је позван експресиони процесор. Као што је објашњено у наставку, обично је најбоље додати изразе у заштитне сврхе како би се спречило да командни анализатор изврши замене на садржају.

За неке примере једноставних израза, претпоставимо да променљива а има вриједност 3, а варијабла б има вриједност 6. Затим команда са леве стране сваке од линија испод доноси вредност на десној страни линије:

екпр 3.1 + $ а6.1 екпр 2 + "$ а. $ б" 5.6 екпр 4 * [л "ленгтх" 6 2 "] 8 екпр {{ворд оне} <" ворд $ а "} 0

Оператори

Важећи оператери су наведени у наставку, груписани по редукцијском реду приоритета:

- + ~!

Унари минус, унари плус, бит-висе НОТ, логички НОТ. Ниједан од ових операнда се не може примијенити на стринг операнде, а битно МИСО се може примијенити само на интегерс.

* /%

Помножите, поделите, остатак. Ниједан од ових операнда се не може примијенити на стринг операнде, а остатак може бити примијењен само на интегерс. Остатак увек има исти знак као и делилац и апсолутна вредност мања од дељива.

+ -

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

<< >>

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

<> <=> =

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

==! =

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

& &

Битно и. Важећи само за цео број операнди.

^

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

|

Битно м. Важећи само за цео број операнди.

&&

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

||

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

к ? и : з

Ако-онда-друго, као у Ц. Ако к процењује на нула, онда је резултат вредност и . Иначе, резултат је вредност з . Кс операнд мора имати нумеричку вредност.

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

екпр 4 * 2 <7

враћа 0.

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

екпр {$ в? [а]: [б]

само један од [а] или [б] ће се стварно процијенити, зависно од вриједности $ в . Приметите, међутим, да је ово једино тачно ако је читав израз затворен у грудима; у супротном, Тцл парсер ће процијенити и [а] и [б] пре него што позове наредбу екпр .

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

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

абс цосх лог скрт ацос доубле лог10 сранд ас екп екп тан атан флоор ранд танх атан2 фмод роунд цеил хипот син цос инт синх

абс ( арг )

Враћа апсолутну вредност арг . Арг може бити или цела или плутајућа тачка, а резултат се враћа у истом облику.

ацос ( арг )

Враћа арц косинус арг , у опсегу [0, пи] радијана. Арг треба да буде у опсегу [-1,1].

асин ( арг )

Враћа арц сине арг , у опсегу [-пи / 2, пи / 2] радианима. Арг треба да буде у опсегу [-1,1].

атан ( арг )

Враћа арц тангент арг , у опсегу [-пи / 2, пи / 2] радианима.

атан2 ( к, и )

Враћа тангентну тачку и / к , у опсегу [-пи, пи] радианс. к и и не могу бити оба 0.

цеил ( арг )

Враћа најмању целобројну вриједност не мање од арг .

цос ( арг )

Враћа косинус аргума , мерен у радијанцима.

цосх ( арг )

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

доубле ( арг )

Ако арг представља плутајућу вриједност, враћа арг , иначе претвара арг у флоатинг и враћа конвертовану вриједност.

екп ( арг )

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

под ( арг )

Враћа највећу интегралну вредност која није већа од арг .

фмод ( к, и )

Враћа остатак пливајуће тачке од поделе к за и . Ако је и 0, грешка се враћа.

хипот ( к, и )

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

инт ( арг )

Ако арг представља цјеловиту вриједност, враћа аргумент , иначе претвара арг у цијели број тако што се скраћује и враћа конвертовану вриједност.

лог ( арг )

Враћа природни логаритам арг . Арг мора бити позитивна вредност.

лог10 ( арг )

Враћа базу 10 логаритма арг . Арг мора бити позитивна вредност.

пов ( к, и )

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

ранд ()

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

округли ( арг )

Ако арг представља цјеловиту вриједност, враћа аргумент , иначе претвара арг у цијели број округлим столом и враћа конвертовану вриједност.

син ( арг )

Враћа синус аргума , мерен у радијанцима.

синх ( арг )

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

скрт ( арг )

Враћа квадратни коријен арг . Арг мора бити негативан.

сранд ( арг )

Арг , који мора бити цео број, користи се за ресетовање семена за генератор случајних бројева. Враћа први случајни број из тог семена. Сваки тумач има своје семе.

тан ( арг )

Враћа тангент аргума , мјерену у радијанцима.

танх ( арг )

Враћа хиперболични тангент арг .

Поред ових унапред дефинисаних функција, апликације могу дефинирати додатне функције користећи Тцл_ЦреатеМатхФунц ().

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

Сви интерни обрачуни који укључују интегерс се обављају дугачким Ц типом, а сви интерни рачунари који укључују плутајуће тачке се обављају са двоструким типом Ц. Када конвертује низ у флоатинг поинт, открива се оверфлов експонента и резултира грешком Тцл. За конверзију у цијели низ из стринга, детекција преливања зависи од понашања неких рутина у локалној Ц библиотеци, тако да би требало сматрати непоузданим. У сваком случају, цјелобројни прелив и пријелаз се генерално не откривају поуздано за средње резултате. Преливање и падање плутајућих тачака се детектују до степена који подржава хардвер, што је генерално прилично поуздано.

Конверзија између интерних приказа за интегер, флоатинг-поинт и стринг операндс се врши аутоматски по потреби. За аритметичка израчунавања, интегрирају се све док се не унесе неки број са плутајућим тачкама, након чега се користи плутајућа тачка. На пример,

екпр 5/4

враћа 1, док

екпр 5 / 4.0 екпр 5 / ([дужина стринга "абцд"] + 0.0)

обе врате 1.25. Вредности плутајуће тачке се увек враћају са `` . '' или е, тако да неће изгледати као цјеловите вриједности. На пример,

екпр 20.0 / 5.0

враћа 4.0 , а не 4 .

Стринг Оператионс

Вредности стринга могу се користити као операнди оператора успоредбе, иако евалуатор израза покушава направити поређења као цијели број или плутајуће тачке када то може. Ако је један од операнди упоређивања низ, а други има нумеричку вредност, нумерички операнд се конвертује назад у низ користећи спецификатор формата Ц спринтф % д за интегерс и % г за вриједности са флоатинг поинт. На примјер, команде

екпр {"0к03" > "2"} екпр {"0и" <"0к12"}

оба повратка 1. Прво поређење се врши користећи упоређивање целог броја, а друго се врши помоћу упоређивања стринга након што се други конвертор претвори у низ 18 . Због тенденције Тцл-а да третира вриједности као бројеве кад год је то могуће, није опћенито добра идеја да користите оператере попут == када заиста желите низ поређења и вриједности операнди могу бити произвољне; у овим случајевима је боље користити уместо стринг стринг .

Оцена учинка

Додајте изразе у облику за најбољу брзину и најмање захтеве за складиштењем. Ово омогућава Тцл битецоде компајлеру да генерише најбољи код.

Као што је већ поменуто, изрази се замењују два пута: једанпут помоћу Тцл парсера и једном командом екпр . На примјер, команде

подесите 3 скупа б {$ а + 2} екпр $ б * 4

враћање 11, а не вишеструко 4. Ово је зато што ће Тцл парсер прво заменити $ а + 2 за варијаблу б , онда ће команда екпр процијенити израз $ а + 2 * 4 .

Већини израза не захтевају други круг замене. Или су затворени у грудима или, ако не, њихове варијабилне и командне супституције доносе бројеве или стрингове који сами не захтевају замјене. Међутим, пошто је за неколико необрабљених израза потребно два круга замена, компајлер битецоде мора да емитује додатне инструкције за рјешавање ове ситуације. Најскупљи код је потребан за необрађене изразе који садрже командне замене. Ови изрази се морају имплементирати стварањем новог кода сваки пут када се израз изводи.

Кључне речи

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

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