Linux / Unix Komutu: expr

isim

expr - Bir ifadeyi değerlendirin

özet

expr arg ? arg arg ...

Arg ' sleri (aralarında ayırıcı boşluklar ekleyerek) birleştirir, sonucu bir Tcl ifadesi olarak değerlendirir ve değeri döndürür. Tcl ifadelerinde izin verilen operatörler C ifadelerinde izin verilen operatörlerin bir alt kümesidir ve ilgili C işleçleriyle aynı anlama ve önceliğe sahiptirler. İfadeler neredeyse her zaman sayısal sonuçlar verir (tamsayı veya kayan nokta değerleri). Örneğin, ifade

8,5 + 6

14.2'ye değerlendirir. Tcl ifadeleri, işlenenlerin belirtildiği şekilde C ifadelerinden farklıdır. Ayrıca, Tcl ifadeleri sayısal olmayan işlenenleri ve dize karşılaştırmasını destekler.

İşlenenler

Bir Tcl ifadesi, işlenenlerin, operatörlerin ve parantezlerin birleşiminden oluşur. İşlenenler ve operatörler ve parantezler arasında beyaz boşluk kullanılabilir; İfadenin talimatları tarafından göz ardı edilir. Mümkün olduğunda, işlenenler tamsayı değerleri olarak yorumlanır. Tamsayı değerleri ondalık (normal durum), sekizli (işlenenin ilk karakteri 0 ise ) veya onaltılık olarak (işlenenin ilk iki karakteri 0x ise ) belirtilebilir. Bir işlenen yukarıda verilen tamsayı formatlarından birine sahip değilse, bu mümkün ise kayan noktalı sayı olarak kabul edilir. Kayan noktalı sayılar ANSI uyumlu bir C derleyici tarafından kabul edilen yollardan herhangi birinde belirtilebilir ( f , F , l ve L eklerinin çoğu yüklemede izin verilmemesi dışında). Örneğin, aşağıdakilerin tümü geçerli kayan nokta sayılarıdır: 2.1, 3., 6e4, 7.91e + 16. Sayısal yorumlama mümkün değilse, bir işlenen bir dizge olarak bırakılır (ve yalnızca sınırlı bir dizi işleçler uygulanabilir).

İşlenenler aşağıdaki yollardan biriyle belirtilebilir:

[1]

Sayısal bir değer olarak, tamsayı veya kayan nokta.

[2]

Standart $ notasyonu kullanarak bir Tcl değişkeni olarak. Değişkenin değeri, işlenen olarak kullanılacaktır.

[3]

Çift tırnak içine alınmış bir dize olarak. İfade ayrıştırıcı, tırnak işaretleri arasındaki bilgi üzerinde ters eğik çizgi, değişken ve komut ikameleri gerçekleştirecek ve sonuç değerini işlenen olarak kullanacaktır.

[4]

Diş telleri içine alınmış bir dize olarak. Açık parantez ile eşleşen yakın parantez arasındaki karakterler herhangi bir ikame olmaksızın işlenen olarak kullanılacaktır.

[5]

Parantez içine alınmış bir Tcl komutu. Komut yürütülür ve sonucu işlenen olarak kullanılır.

[6]

Argümanları, günah ($ x) gibi işlenenler için yukarıdaki formlardan herhangi birine sahip olan matematiksel bir işlev olarak. Tanımlanmış fonksiyonların listesi için aşağıya bakın.

İkamelerin yukarıda gerçekleştiği yerlerde (örneğin, alıntılanmış dizeler içinde), bunlar ifadenin talimatları ile gerçekleştirilir. Bununla birlikte, ifade işlemcisi çağrılmadan önce ek bir ikame katmanı zaten komut ayrıştırıcısı tarafından gerçekleştirilmiş olabilir. Aşağıda tartışıldığı gibi, komut ayrıştırıcısının içerik üzerinde ikameleri gerçekleştirmesini önlemek için ifadeleri parantez içine almak genellikle en iyisidir.

Basit ifadelerin bazı örnekleri için, a değişkeninin 3 değerine ve b değişkeninin de 6 değerine sahip olduğunu varsayalım. Ardından, aşağıdaki satırların her birinin sol tarafındaki komut satırın sağ tarafındaki değeri üretecektir:

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5,6 expr 4 * [llength "6 2"] 8 expr {{kelime bir} <"kelime $ a"} 0

Operatörler

Geçerli operatörler aşağıda listelenmiştir, öncelik sırasına göre gruplandırılmıştır:

- + ~!

Unary eksi, unary plus, bit-bilge NOT, mantıksal DEĞİL. Bu işlenenlerden hiçbiri dize işlenenlerine uygulanamaz ve bit-bilge NOT sadece tamsayılara uygulanamaz.

* /%

Çarpın, böl, geri kalan. Bu işlenenlerin hiçbiri string işlenenlerine uygulanamaz ve geri kalan sadece tam sayılara uygulanabilir. Kalan kısım her zaman bölen ile aynı işarete ve bölenden daha küçük bir mutlak değere sahip olacaktır.

+ -

Ekleme ve çıkarma. Herhangi bir sayısal işlenen için geçerlidir.

<< >>

Sol ve sağ vardiya. Yalnızca tamsayı işlenenler için geçerlidir. Doğru vardiya her zaman işaret bitini yayar.

<> <=> =

Boolean daha az, daha büyük, daha az veya eşit ve daha büyük veya eşittir. Her operatör, koşul doğruysa 1, aksi takdirde 0 üretir. Bu işleçler, dizgeli karşılaştırmanın kullanıldığı durumda dizilere ve sayısal işlenenlere uygulanabilir.

==! =

Boole eşit ve eşit değil. Her operatör bir sıfır / bir sonuç üretir. Tüm işlenen türleri için geçerlidir.

&

Bit Bilge VE. Yalnızca tamsayı işlenenler için geçerlidir.

^

Bit-bilge özel VEYA. Yalnızca tamsayı işlenenler için geçerlidir.

|

Bit Bilekli VEYA. Yalnızca tamsayı işlenenler için geçerlidir.

&&

Mantıksal VE. Aksine, her iki işlenenin sıfırdan farklı olması durumunda 1 sonuç üretilir. Yalnızca boole ve sayısal (tamsayılar veya kayan nokta) işlenenler için geçerlidir.

||

Mantıksal VEYA. Her iki işlenen sıfır ise 1, 0 sonuç üretir. Yalnızca boole ve sayısal (tamsayılar veya kayan nokta) işlenenler için geçerlidir.

x y : z

Eğer öyleyse, C'deki gibi. Eğer x sıfırdan farklı değilse, sonuç y'nin değeridir. Aksi halde sonuç, z'nin değeridir. X işleneninin sayısal bir değeri olmalıdır.

Her operatörün ürettiği sonuçlar hakkında daha fazla bilgi için C kılavuzuna bakın. Tüm ikili işleçler grubu aynı öncelik düzeyi içinde soldan sağa. Örneğin, komut

expr 4 * 2 <7

0 değerini döndürür.

&& , || ve ?: operatörler C'deki gibi tembel bir değerlendirme yaparlar. Bu da sonuçların belirlenmesi için gerekli olmadıkça işlenenlerin değerlendirilmediği anlamına gelir. Örneğin, komutta

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

[a] veya [b] yalnızca bir tanesi, $ v değerine bağlı olarak değerlendirilecektir. Bununla birlikte, bunun yalnızca tüm ifadenin parantez içine alındığı durumlarda geçerli olduğunu unutmayın; aksi halde, Tcl ayrıştırıcısı, expr komutunu çağırmadan önce hem [a] hem de [b] değerlerini değerlendirir.

Matematik Fonksiyonları

Tcl, aşağıdaki matematiksel işlevleri ifadelerde destekler:

abs cosh günlüğü sqrt acos çift log10 srand asin exp pow tan atan kat rand tanh atan2 fmod yuvarlak tavan hipot sin çünkü cos sin sinh

abs ( arg )

Arg'nin mutlak değerini döndürür. Arg , tamsayı veya kayan nokta olabilir ve sonuç aynı biçimde döndürülür.

acos ( arg )

Arg'nin ark kosinüsünü [0, pi] radyanlarda döndürür. Arg , [-1,1] aralığında olmalıdır.

asin ( arg )

[-pi / 2, pi / 2] radyan aralığında arg ark arbini döndürür. Arg , [-1,1] aralığında olmalıdır.

atan ( arg )

Arg'nin ark tanjantını [-pi / 2, pi / 2] radyan cinsinden döndürür.

atan2 ( x, y )

Y / x'in ark tanjantını [-pi, pi] radyanlar aralığında döndürür. x ve y ikisi de olamaz.

tavan ( arg )

Arg'den küçük olmayan en küçük tamsayı değerini döndürür.

çünkü ( arg )

Radyan cinsinden ölçülen argin kosinüsünü döndürür.

cosh ( arg )

Arg'nin hiperbolik kosinüsünü döndürür. Sonuç taşmaya neden olursa, bir hata döndürülür.

çift ​​( arg )

Eğer arg değişken bir değer ise arg argümanını döndürür, aksi takdirde arg değişkenini kayan olarak dönüştürür ve dönüştürülen değeri döndürür.

exp ( arg )

E ** arg olarak tanımlanan arg'nin üstelini döndürür. Sonuç taşmaya neden olursa, bir hata döndürülür.

kat ( arg )

Arg'den büyük olmayan en büyük integral değerini döndürür.

fmod ( x, y )

X bölümünün kayan nokta kalanını y ile döndürür. Y 0 ise, bir hata döndürülür.

hipot ( x, y )

Sağ açılı bir üçgenin hipotenüsünün uzunluğunu hesaplar ( x * x + y * y ).

int ( arg )

Eğer arg bir tamsayı ise arg argümanını döndürür, aksi halde arg ile integrali değiştirir ve dönüştürülmüş değeri döndürür.

log ( arg )

Arg'nin doğal logaritmasını döndürür. Arg , pozitif bir değer olmalıdır.

log10 ( arg )

Arg taban 10 logaritmasını döndürür. Arg , pozitif bir değer olmalıdır.

pow ( x, y )

Y'ye yükseltilmiş x değerini hesaplar. Eğer x negatif ise, y tam sayı olmalıdır.

rand ()

Kayan nokta sayısını sıfırdan bir taneden azına veya matematiksel terimlerle [0,1] aralığına döndürür. Tohum, makinenin dahili saatinden gelir ya da manuel işlevle manuel olarak ayarlanabilir.

yuvarlak ( arg )

Eğer arg bir tamsayı ise arg argümanını döndürür, aksi takdirde argümanı yuvarlayarak yuvarlatır ve dönüştürülen değeri döndürür.

günah

Radyan cinsinden ölçülen arg sinüsünü döndürür.

sinh ( arg )

Arg'nin hiperbolik sinüsünü döndürür. Sonuç taşmaya neden olursa, bir hata döndürülür.

sqrt ( arg )

Arg'nin karekökünü döndürür. Arg negatif olmayan olmalıdır.

srand ( arg )

Tam sayı olması gereken arg , rasgele sayı üretecine ait tohumun sıfırlanması için kullanılır. Bu tohumdan ilk rastgele sayıyı döndürür. Her tercümanın kendi çekirdeği vardır.

tan ( arg )

Radyan cinsinden ölçülen argünün teğetini döndürür.

tanh ( arg )

Arg hiperbolik tanjantını döndürür.

Bu önceden tanımlanmış işlevlere ek olarak, uygulamalar Tcl_CreateMathFunc () kullanarak ek işlevleri tanımlayabilir.

Tipler, Taşma ve Hassasiyet

Tamsayıları içeren bütün iç hesaplamalar C tipi uzunluğunda yapılır ve kayan nokta içeren tüm iç hesaplamalar C tipi çift ile yapılır. Bir dize kayan noktaya dönüştürürken, üs taşması algılanır ve bir Tcl hatasıyla sonuçlanır. Dizgeden tamsayıya dönüştürmek için, taşma algılaması yerel C kütüphanesindeki bazı rutinlerin davranışlarına bağlıdır, bu yüzden güvenilmez olarak kabul edilmelidir. Her durumda, ara sonuçlar için tamsayı taşması ve alt akışı genellikle güvenilir şekilde saptanmaz. Kayan nokta taşması ve alt akışı genellikle oldukça güvenilir olan donanım tarafından desteklenen dereceye kadar algılanır.

Tamsayı, kayan nokta ve dize işlenenleri için iç gösterimler arasında dönüştürme gerektiği gibi otomatik olarak yapılır. Aritmetik hesaplamalar için, bazı kayan nokta sayısı ekleninceye kadar tamsayılar kullanılır, bundan sonra kayan nokta kullanılır. Örneğin,

5/4

1 değerini döndürür

5 / 4,0 expr 5 / ([string length ”abcd"] + 0.0)

her ikisi de 1.25 değerini döndürür. Kayan nokta değerleri her zaman bir `` ile döndürülür . '' veya bir e, böylece tamsayı değerleri gibi görünmeyeceklerdir. Örneğin,

20.0 / 5.0

4 döndürür, 4 değil.

Dize İşlemleri

Deyim değerlendiricisi, karşılaştırma yapabildiği zaman tamsayı veya kayan nokta olarak karşılaştırmalar yapmaya çalışsa da, dize değerleri karşılaştırma işleçlerinin işlenenleri olarak kullanılabilir. Bir karşılaştırmanın işlenenlerinden biri bir dize ve diğeri sayısal bir değere sahipse, sayısal işlenen, tamsayılar için C sprintf biçim belirteci % d ve kayan nokta değerleri için % g kullanılarak bir dizgeye geri dönüştürülür. Örneğin, komutlar

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

her ikisi de geri dönüş 1. İlk karşılaştırma, tamsayı karşılaştırması kullanılarak yapılır ve ikincisi, ikinci işleneni dize 18 dönüştürüldükten sonra dize karşılaştırması kullanılarak yapılır. Tcl'nin değerleri mümkün olduğu kadar sayı olarak işleme eğilimi nedeniyle, dizgecin karşılaştırmasını gerçekten istediğiniz zaman == gibi operatörleri kullanmak genellikle iyi bir fikir değildir ve işlenenlerin değerleri isteğe bağlı olabilir; Bu durumda dize komutunu kullanmak daha iyidir.

Performansla ilgili önemli noktalar

En iyi hız ve en küçük depolama gereksinimleri için ifadeleri parantez içine alın. Bu, Tcl bytecode derleyicisinin en iyi kodu oluşturmasına izin verir.

Yukarıda belirtildiği gibi, ifadeler iki kez ikame edilir: bir kez Tcl ayrıştırıcısı ve bir kez expr komutu ile. Örneğin, komutlar

3 set b ayarlayın {$ a + 2} expr $ b * 4

Geri dönüş 11, birden fazla 4 değil. Bunun nedeni, Tcl ayrıştırıcısının önce b değişkeni için $ a + 2'nin yerini alacağı, daha sonra expr komutunun $ a + 2 * 4 ifadesini değerlendireceği içindir.

Çoğu ifade, ikinci bir ikame turu gerektirmez. Ya parantez içine alınırlar, ya da olmasalardı, değişkenleri ve komut ikameleri, kendileri için ikame gerektirmeyen sayı ya da dizge verir. Bununla birlikte, birkaç karmaşık olmayan ifadenin iki tur değişikliği gerektirdiğinden, bytecode derleyicisi bu durumu ele almak için ek talimatlar vermelidir. En pahalı kod, komut ikameleri içeren kesilmemiş ifadeler için gereklidir. Bu ifadeler, ifadenin her yürütüldüğünde yeni kod üretilerek uygulanmalıdır.

Anahtar kelimeler

aritmetik, boole , karşılaştır, ifade, bulanık karşılaştırma

Önemli: Komutunuzun belirli bir bilgisayarda nasıl kullanıldığını görmek için man komutunu ( % adam ) kullanın.