Komanda Linux / Unix: expr

emër

expr - Vlerësoni një shprehje

përmbledhje

expr arg ? arg arg ... ?

Bashkërendon argumentet (duke shtuar hapësira ndarëse ndërmjet tyre), vlerëson rezultatin si një shprehje Tcl dhe e kthen vlerën. Operatorët e lejuar në shprehjet Tcl janë një mesin e operatorëve të lejuar në shprehjet C dhe kanë të njëjtin kuptim dhe përparësi si operatorët përkatës C. Shprehjet pothuajse gjithmonë japin rezultate numerike (vlera të plota ose të pandryshueshme). Për shembull, shprehja

expr 8.2 + 6

vlerëson të 14.2. Shprehjet Tcl ndryshojnë nga shprehjet C në mënyrën se si specifikohen operandet. Gjithashtu, shprehjet Tcl mbështesin operandat jo numerike dhe krahasimet e vargjeve.

operandët

Një shprehje Tcl përbëhet nga një kombinim i operandëve, operatorëve dhe kllapave. Hapësira e bardhë mund të përdoret midis operandeve dhe operatorëve dhe kllapave; ajo injorohet nga udhëzimet e shprehjes. Aty ku është e mundur, operandët interpretohen si vlera të plota. Vlerat e integruara mund të specifikohen në decimal (rast normal), në oktal (nëse karakteri i parë i operandit është 0 ), ose në heksadecimal (nëse dy karakteret e para të operandit janë 0x ). Nëse një operand nuk ka një nga formatet e plota të dhëna më lart, atëherë ai trajtohet si një numër i pikës lundruese nëse kjo është e mundur. Numrat me pikë të luajtshme mund të specifikohen në secilën nga mënyrat e pranuara nga një përpilues C i përputhshëm me ANSI (përveç se suffixes f , F , l dhe L nuk do të lejohen në shumicën e instalimeve). Për shembull, të gjitha këto janë numra të vlefshëm lundrues: 2.1, 3., 6e4, 7.91e + 16. Nëse nuk ka interpretim numerik, atëherë një operand mbetet si një varg (dhe vetëm një grup i kufizuar operatorësh mund të aplikohet për të).

Operandat mund të specifikohen në një nga mënyrat e mëposhtme:

[1]

Si një vlerë numerike, ose numër i plotë ose pikat lundruese.

[2]

Si një ndryshore Tcl, duke përdorur notation standard $ . Vlera e variablave do të përdoret si operand.

[3]

Si një varg i mbyllur në kuotat e dyfishta. Parser shprehës do të kryejë backslash, ndryshueshme, dhe zëvendësimet e komandës në informacionin midis citate, dhe të përdorin vlerën rezulton si operand

[4]

Si një varg mbyllur në formatimin e teksteve. Karakteret ndërmjet mbajtëses së hapur dhe përkulëses së ngushtë të afërt do të përdoren si operand pa asnjë zëvendësim.

[5]

Si një komandë Tcl mbyllur në kllapa. Komanda do të ekzekutohet dhe rezultati i saj do të përdoret si operand.

[6]

Si një funksion matematikor argumentet e të cilit kanë ndonjë nga format e mësipërme për operandat, të tilla si mëkati ($ x) . Shihni më poshtë për një listë të funksioneve të përcaktuara.

Kur zëvendësimet ndodhin më lart (p.sh. vargjet brenda cituar), ato kryhen me udhëzimet e shprehjes. Megjithatë, një shtresë shtesë e zëvendësimit mund të jetë kryer tashmë nga parser komandë para se të quhej procesori i shprehjes. Siç diskutohet më poshtë, zakonisht është e mirë që të bashkëngjitni shprehjet në vija të prera për të parandaluar parser komandues që të kryejë zëvendësime në përmbajtje.

Për disa shembuj të shprehjeve të thjeshta, supozoni se variabla a ka vlerën 3 dhe variabla b ka vlerën 6. Atëherë komanda në anën e majtë të secilës prej linjave më poshtë do të prodhojë vlerën në anën e djathtë të vijës:

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

operatorët

Operatorët e vlefshëm janë renditur më poshtë, të grupuara në renditje rënëse të përparësisë:

- + ~!

Unary minus, unary plus, bit-wise NUK, NUK logjike. Asnjë prej këtyre operandeve nuk mund të aplikohet tek operandat e vargut, dhe NUK mund të aplikohet vetëm në numra të plotë.

* /%

Multiply, ndani, mbetur. Asnjë nga këto operands nuk mund të aplikohet në operands string, dhe pjesa e mbetur mund të aplikohet vetëm për numra të plotë. Pjesa tjetër do të ketë gjithmonë shenjën e njëjtë si divizioni dhe një vlerë absolute më të vogël se divizioni.

+ -

Shtoni dhe zbrisni. E vlefshme për çdo operand numerik.

<< >>

Zhvendosja e majtë dhe e drejta E vlefshme vetëm për operandet e numrit të plotë. Një zhvendosje e drejtë gjithnjë e përhap më pak shenjën.

<> <=> =

Boolean më pak, më i madh, më pak ose i barabartë, dhe më i madh ose i barabartë. Secili operator prodhon 1 nëse kushti është i vërtetë, 0 ndryshe. Këta operatorë mund të aplikohen në strings, si dhe operands numerike, në të cilin rast përdoret krahasimi i vargut.

==! =

Boolean të barabartë dhe jo të barabartë. Çdo operator prodhon një rezultat zero / një. E vlefshme për të gjitha llojet e operandit.

&

Bit-i mençur DHE. E vlefshme vetëm për operandet e numrit të plotë.

^

Pak e urtë ekskluzive OSE. E vlefshme vetëm për operandet e numrit të plotë.

|

Bit-i mençur OSE. E vlefshme vetëm për operandet e numrit të plotë.

&&

Logjike DHE. Prodhon një rezultat 1 nëse të dy operandat janë jo-zero, 0 ndryshe. I vlefshëm vetëm për operacione boolean dhe numerik (integers ose lundrues).

||

Logjike OSE. Prodhon një rezultat 0 nëse të dy operandat janë zero, 1 ndryshe. I vlefshëm vetëm për operacione boolean dhe numerik (integers ose lundrues).

x ? y : z

Nëse-atëherë-tjetër, si në C. Nëse x vlerëson jo-zero, atëherë rezultati është vlera e y . Përndryshe, rezultati është vlera e z . Operandi x duhet të ketë një vlerë numerike.

Shikoni manualin C për më shumë detaje mbi rezultatet e prodhuara nga secili operator. Të gjithë grupuesit e binarëve të grupit majtas-djathtas brenda nivelit të njëjtë të përparësisë. Për shembull, komanda

expr 4 * 2 <7

kthehet 0.

&& , || , dhe ?: operatorët kanë `` vlerësim dembel '', ashtu si në C, që do të thotë se operands nuk janë vlerësuar nëse ato nuk janë të nevojshme për të përcaktuar rezultatin. Për shembull, në komandën

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

vetëm një nga [a] ose [b] në të vërtetë do të vlerësohet, varësisht nga vlera e $ v . Vini re, megjithatë, se kjo është e vërtetë vetëm nëse e gjithë shprehja është e mbyllur në rrathë; përndryshe, analiza Tcl do të vlerësojë dy [a] dhe [b] para se të thirret komanda expr .

Funksionet e matematikës

Tcl mbështet funksionet e mëposhtme matematikore në shprehje:

abs cosh log sqrt acos dyfishtë log10 srand asin exp pow tan atan kat rand tanh atan2 fmod rrumbullakët cept hypot sin cos int sinh

abs ( arg )

Jep vlerën absolute të arg . Arg mund të jetë ose integer ose pikë lundrues, dhe rezultati kthehet në të njëjtën formë.

acos ( arg )

Kthen kosinusin e harkut të arg , në rrezet [0, pi] radians. Arg duhet të jetë në rangun [-1,1].

asin ( arg )

Kthen sinusin e harkut të arg , në rrezet [-pi / 2, pi / 2] radianë. Arg duhet të jetë në rangun [-1,1].

atan ( arg )

Jep tangjen e harkut të arg , në rrezet [-pi / 2, pi / 2] radianë.

atan2 ( x, y )

Jep tangjen e harkut të y / x , në radian [-pi, pi]. x dhe y nuk mund të jenë të dyja.

ceil ( arg )

Jep vlerën më të vogël të integerit jo më pak se arg .

cos ( arg )

Kthen kosinusin e arg , i matur në radianë.

cosh ( arg )

Kthen kosinusin hiperbolik të arg . Nëse rezultati do të shkaktonte një tejkalim, do të kthehej një gabim.

dyfish ( arg )

Nëse arg është një vlerë lundrues, kthimi arg , përndryshe konverton arg në lundrues dhe kthen vlerën e konvertuar.

exp ( arg )

Jep eksponencën e arg , e përcaktuar si e ** arg . Nëse rezultati do të shkaktonte një tejkalim, do të kthehej një gabim.

kati ( arg )

Jep vlerën më të madhe integrale jo më të madhe se arg .

fmod ( x, y )

Jep pjesën e mbetur në ndarjen e x me y . Nëse y është 0, kthehet një gabim.

hipoteka ( x, y )

Llogarit gjatësinë e hipotenuzës së një trekëndëshi të drejtë-angled ( x * x + y * y ).

int ( arg )

Nëse arg është një vlerë e plotë, kthimet arg , përndryshe konverton arg në numër të plotë nga truncation dhe kthen vlerën e konvertuar.

log ( arg )

Jep logaritmin natyror të arg . Arg duhet të jetë një vlerë pozitive.

log10 ( arg )

Jep bazën 10 logaritmën e arg . Arg duhet të jetë një vlerë pozitive.

pow ( x, y )

Llogarit vlerën e x ngritur në fuqinë y . Nëse x është negativ, y duhet të jetë një vlerë e plotë.

rand ()

Kthen një numër pikën e notit nga zero në vetëm më pak se një ose, në terma matematikore, diapazoni [0,1]. Fara vjen nga ora e brendshme e makinës ose mund të vendoset manual me funksionin srand.

raund ( arg )

Nëse arg është një vlerë e plotë, kthimi arg , përndryshe konverton arg në numër të plotë nga raundi dhe kthen vlerën e konvertuar.

mëkati ( arg )

Jep sinin e arg , të matur në radianë.

sinh ( arg )

Jep sinin hiperbolik të arg . Nëse rezultati do të shkaktonte një tejkalim, do të kthehej një gabim.

sqrt ( arg )

Jep rrënjë katrore të arg . Arg duhet të jetë jo-negative.

srand ( arg )

Arg , i cili duhet të jetë një numër i plotë, përdoret për të rivendosur farën për gjeneratorin e numrave të rastësishëm. Jep numrin e parë të rastit nga ai farë. Çdo përkthyes ka farën e vet.

tan ( arg )

Jep tangjen e arg , e matur në radianë.

tanh ( arg )

Jep tangjen hiperbolike të arg .

Përveç këtyre funksioneve të paracaktuara, aplikacionet mund të përcaktojnë funksione shtesë duke përdorur Tcl_CreateMathFunc ().

Llojet, tejmbushjen dhe precizitetin

Të gjitha llogaritë e brendshme që përfshijnë integers bëhen me llojin C të gjatë dhe të gjitha llogaritë e brendshme që përfshijnë pikat lundruese bëhen me dyfishin e tipit C. Kur konvertohet një varg në pikën lundruese, eksplodimi i eksponentit zbulohet dhe rezulton në një gabim Tcl. Për konvertimin në numër të plotë nga vargu, zbulimi i mbipopullimit varet nga sjellja e disa rutinave në bibliotekën lokale C, prandaj duhet të konsiderohet si jo e besueshme. Në çdo rast, dalja e numrit të plotë dhe nëntemë përgjithësisht nuk zbulohen në mënyrë të besueshme për rezultatet e ndërmjetme. Lëvizja e pëlhurave dhe nënvlefsja janë zbuluar deri në shkallën e mbështetur nga hardueri, e cila në përgjithësi është mjaft e besueshme.

Konvertimi midis përfaqësimeve të brendshme për integer, pikat lundruese dhe operandat e vargut bëhet automatikisht sipas nevojës. Për llogaritjet aritmetike, numrat e plotë përdoren derisa të futet një numër i pikës lundruese, pas së cilës përdoret pika lundruese. Për shembull,

expr 5/4

kthimet 1, ndërkohë

expr 5 / 4.0 expr 5 / ([gjatësia e vargut "abcd"] + 0.0)

të dy kthen 1.25. Vlerat floating-point gjithmonë kthehen me një `` . '' ose një e kështu që ata nuk do të duken si vlera të integruara. Për shembull,

expr 20.0 / 5.0

kthimet 4.0 , jo 4 .

Operacionet String

Vlerat string mund të përdoren si operandë të operatorëve krahasues, edhe pse vlerësuesi i shprehjes përpiqet të bëjë krahasime si numër të plotë ose pikë lundrues kur të jetë e mundur. Nëse një nga operandat e një krahasimi është një varg dhe tjetri ka një vlerë numerike, operandi numerik kthehet prapa në një varg duke përdorur specifikuesin e formatit C sprintf % d për integers dhe % g për vlerat në pikë lundruese. Për shembull, komandat

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

të dy kthehen 1. Krahasimi i parë bëhet duke përdorur krahasimin e numrave të plotë dhe e dyta bëhet duke përdorur krahasimin e vargut pasi operandi i dytë konvertohet në vargun 18 . Për shkak të tendencës së Tcl-së për të trajtuar vlerat si numra sa herë që është e mundur, nuk është në përgjithësi një ide e mirë për të përdorur operatorë si == kur ju dëshironi vërtet krahasimin e vargut dhe vlerat e operandeve mund të jenë arbitrare; është më mirë që në këto raste të përdoret komanda e vargut .

Konsiderata të Performancës

Përfshirja e shprehjeve në mbajtëse për shpejtësinë më të mirë dhe kërkesat më të vogla për ruajtje. Kjo lejon përpiluesin e bytecode Tcl të gjenerojë kodin më të mirë.

Siç u përmend më sipër, shprehjet janë zëvendësuar dy herë: një herë nga analiza Tcl dhe një herë nga komanda expr . Për shembull, komandat

vendosni një grup 3 b {$ a + 2} expr $ b * 4

kthimi 11, jo një shumëfish i 4. Kjo për arsye se analiza Tcl së pari do të zëvendësojë $ a + 2 për variablin b , atëherë komanda expr do të vlerësojë shprehjen $ a + 2 * 4 .

Shumica e shprehjeve nuk kërkojnë një raund të dytë të zëvendësimeve. Ose ato janë të mbyllura në formatimin e teksteve ose, nëse jo, ndryshimet e tyre dhe zëvendësimet e komandimit japin numra ose vargje që nuk kërkojnë zëvendësime. Megjithatë, për shkak se disa shprehje të pambrojtur kanë nevojë për dy raunde zëvendësimi, përpiluesi i kodit të baterive duhet të lëshojë udhëzime shtesë për të trajtuar këtë situatë. Kodi më i shtrenjtë është i nevojshëm për shprehjet e pambrojtura që përmbajnë zëvendësime të komandës. Këto shprehje duhet të zbatohen duke gjeneruar kodin e ri çdo herë që ekzekutohet shprehja.

Keywords

aritmetik, boolean , krahasim, shprehje, krahasim fuzzy

E rëndësishme: Përdorni komandën e njeriut ( % man ) për të parë se si përdoret një komandë në kompjuterin tuaj të veçantë.