Linux / Unixコマンド:expr

expr - 式を評価する

シノプシス

expr argarg arg ...

args(それらの間にセパレータスペースを追加する)を連結し、その結果をTcl式として評価し、その値を返します。 Tcl式で許可される演算子は、C式で許可される演算子のサブセットであり、対応するC演算子と同じ意味と優先順位を持ちます。 式はほとんどの場合、数値結果 (整数または浮動小数点値)を生成します。 例えば、式

expr 8.2 + 6

14.2と評価される。 Tcl式は、C式とはオペランドの指定方法が異なります。 また、Tcl式は、非数値のオペランドと文字列の比較をサポートしています。

オペランド

Tcl式は、オペランド、演算子、およびかっこの組み合わせで構成されます。 オペランドと演算子とかっこの間に空白を使用できます。 式の指示によって無視されます。 可能であれば、オペランドは整数値として解釈されます。 整数値は、10進数(通常の場合)、8進数(オペランドの最初の文字が0の場合 )、または16進数(オペランドの最初の2文字が0xの場合 )で指定できます。 オペランドが上記の整数フォーマットのいずれかを持たない場合は、それが可能であれば浮動小数点数として扱われます。 浮動小数点数は、ANSI準拠のCコンパイラが受け入れる方法で指定できます(ほとんどのインストールでは、 fFl 、およびL接尾辞は使用できません)。 たとえば、有効な浮動小数点数は、2.1,3.,6e4,7.91e + 16のすべてです。 数値の解釈が不可能な場合、オペランドは文字列として残されます(そして、限られた演算子のセットのみがそれに適用されます)。

オペランドは、次のいずれかの方法で指定できます。

[1]

数値として、整数または浮動小数点のいずれかです。

[2]

Tcl変数として、標準の$表記を使用します。 変数の値がオペランドとして使用されます。

[3]

二重引用符で囲まれた文字列です。 式パーサーは、引用符間の情報にバックスラッシュ、変数、およびコマンドの置換を実行し、結果の値をオペランドとして使用します

[4]

中括弧で囲まれた文字列です。 中括弧と一致する中括弧の間の文字は、置換されずにオペランドとして使用されます。

[5]

大括弧で囲まれたTclコマンド。 コマンドが実行され、その結果がオペランドとして使用されます。

[6]

sin($ x)のように、引数が上記のオペランドのいずれかの形式を持つ数学関数です。 定義された関数のリストについては以下を参照してください。

置換が上にある場合(例えば、引用符で囲まれた文字列の場合)、それらは式の指示によって実行されます。 ただし、式プロセッサが呼び出される前に、コマンドパーサーが追加の置換レイヤーを既に実行している可能性があります。 以下で説明するように、コマンドパーサーが内容の置換を実行しないように、式を中括弧で囲むことが通常は最善です。

単純な式のいくつかの例では、変数aの値が3で、変数bの値が6であるとします。次に、下の各行の左側のコマンドは、行の右側に値を生成します。

expr 3.1 + $ a6.1 expr 2 + "$ a。$ b" 5.6 expr 4 * [llength "6 2"] 8 expr {{単語1} <"単語$ a"} 0

演算子

有効な演算子は、優先度の高い順にグループ化されています。

- +〜!

単項マイナス、単項プラス、ビット単位NOT、論理NOT。 これらのオペランドは文字列オペランドには適用できず、ビット単位のNOTは整数にのみ適用できます。

* /%

乗算、除算、剰余。 これらのオペランドのいずれも文字列オペランドに適用することはできず、余りは整数のみに適用することができます。 残りは常に除数と同じ符号を持ち、絶対値は除数より小さくなります。

+ -

加算と減算。 任意の数値オペランドに対して有効です。

<< >>

左右シフト。 整数オペランドにのみ有効です。 右シフトは常に符号ビットを伝播します。

<> <=> =

ブール値の小さい方、大きい方、小さい方またはそれ以上、以上または等しい。 各演算子は、条件が真であれば1を、そうでなければ0を生成します。 これらの演算子は数値演算子と同様に文字列にも適用できます。この場合、文字列比較が使用されます。

==!=

ブール値は等しく、等しくない。 各演算子は、0/1の結果を生成します。 すべてのオペランドタイプに有効です。

そして、

ビット単位のAND。 整数オペランドにのみ有効です。

^

ビットごとの排他的論理和。 整数オペランドにのみ有効です。

|

ビット単位のOR。 整数オペランドにのみ有効です。

&&

論理AND。 両方のオペランドが非ゼロの場合は1の結果を、そうでない場合は0の結果を生成します。 ブール値と数値(整数または浮動小数点)のオペランドにのみ有効です。

||

論理OR。 両方のオペランドがゼロの場合は0、そうでない場合は0を返します。 ブール値と数値(整数または浮動小数点)のオペランドにのみ有効です。

x y z

If-then-else、Cのように。xが非ゼロと評価された場合、結果はyの値になります。 それ以外の場合、結果はzの値になります。 xオペランドには数値が必要です。

各オペレーターが作成した結果の詳細については、Cマニュアルを参照してください。 すべてのバイナリ演算子は、同じ優先順位レベル内で左から右にグループ化されます。 たとえば、コマンド

expr 4 * 2 <7

0を返します。

&&|| 、および?:演算子はCと同様に ``遅延評価 ''を持ちます。つまり、結果を決定するためにオペランドが評価されない場合、評価されません。 たとえば、コマンド

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

$ vの値に応じて[a ]または[b ]のいずれか1つだけが実際に評価されます。 ただし、これは、式全体が中括弧で囲まれている場合にのみ当てはまります。 それ以外の場合、Tclパーサーはexprコマンドを呼び出す前に[a][b]の両方を評価します。

数学関数

Tclは、式で次の数学関数をサポートしています。

abs cosh ログ sqrt acosダブルlog10サンド asin エキパート tan atan フロア ランド tanh atan2 fmod ラウンド ceil hypot sin cos int sinh

abs( arg

argの絶対値を返します。 Argは整数または浮動小数点のいずれかであり、結果は同じ形式で返されます。

acos( arg

[0、π]ラジアンの範囲のargの逆余弦を返します。 Argは[-1,1]の範囲になければなりません。

アシン( arg

[-pi / 2、pi / 2]ラジアンの範囲のargの逆正弦を返します。 Argは[-1,1]の範囲になければなりません。

atan( arg

[-pi / 2、pi / 2]ラジアンの範囲のargの逆正接を返します。

atan2( x、y

[-pi、pi]ラジアンの範囲のy / xの逆正接を返します。 xyの両方を0にすることはできません。

セイル( arg

arg以上の最小の整数値を返します。

cos( arg

ラジアン単位でargの余弦を返します。

cosh( arg

argの双曲線コサインを返します。 結果がオーバーフローを引き起こす場合は、エラーが戻されます。

ダブル( arg

argが浮動小数点の場合はargを返し、そうでなければargを浮動小数点に変換し、変換された値を返します。

exp( arg

e ** argと定義されたargの指数を返します。 結果がオーバーフローを引き起こす場合は、エラーが戻されます。

フロア( arg

argより大きくない最大の整数値を返します。

fmod( x、y

xの除算の浮動小数点剰余をyで返します。 yが0の場合、エラーが返されます。

hypot( x、y

直角三角形( x * x + y * y )の斜辺の長さを計算します。

int( arg

argが整数値の場合はargを返し、そうでない場合は切り捨てによってargを整数に変換し、変換された値を返します。

log( arg

argの自然対数を返します。 Argは正の値でなければなりません。

log10( arg

argの底10の対数を返します。 Argは正の値でなければなりません。

pow( x、y

xの値をべき乗yとして計算します。 xが負の場合、 yは整数値でなければなりません。

rand()

ゼロからちょうど1未満の浮動小数点数、または数学的には範囲[0,1]を返します。 シードは、機械の内部時計から来るか、サンド機能でマニュアルに設定することができます。

ラウンド( arg

argが整数値の場合はargを返し、そうでなければargを丸めて整数に変換し、変換された値を返します。

sin( arg

argの正弦をラジアンで返します。

sinh( arg

argの双曲線正弦を返します。 結果がオーバーフローを引き起こす場合は、エラーが戻されます。

sqrt( arg

argの平方根を返します。 Argは負でない必要があります。

srand( arg

整数でなければならないargは、乱数ジェネレータのシードをリセットするために使用されます。 そのシードから最初の乱数を返します。 各インタプリタにはそれぞれ独自のシードがあります。

tan( arg

ラジアン単位でargの正接を返します。

タン( arg

argの双曲線正接を返します。

これらの事前定義された関数に加えて、アプリケーションはTcl_CreateMathFunc ()を使用して追加の関数を定義することができます。

型、オーバーフロー、および精度

整数を含むすべての内部計算はC型longで行われ、浮動小数点を含むすべての内部計算はC型doubleで行われます。 文字列を浮動小数点に変換すると、指数オーバーフローが検出され、Tclエラーが発生します。 文字列から整数への変換では、オーバーフローの検出はローカルCライブラリ内のいくつかのルーチンの動作に依存するため、信頼性がないとみなす必要があります。 いずれにしても、整数オーバーフローおよびアンダーフローは、一般的に、中間結果に対しては確実に検出されない。 浮動小数点のオーバーフローとアンダーフローは、ハードウェアがサポートする程度まで検出されますが、これは一般にかなり信頼性があります。

整数、浮動小数点、および文字列オペランドの内部表現間の変換は、必要に応じて自動的に行われます。 算術演算では、浮動小数点数が導入されるまで整数が使用され、その後浮動小数点が使用されます。 例えば、

expr 5/4

1を返します。

expr 5 / 4.0 expr 5 /([文字列長 "abcd"] + 0.0)

どちらも1.25を返します。 浮動小数点値は常に ``で返されます。 ''またはeで 、整数値のようには見えません。 例えば、

expr 20.0 / 5.0

4ではなく4.0を返します。

文字列操作

比較演算子のオペランドには文字列値を使用できますが、式エバリュエーターは可能な限り比較を整数または浮動小数点として試行します。 比較のオペランドの1つが文字列でもう1つが数値の場合、数値オペランドは整数の場合はC sprintf形式指定子%d 、浮動小数点値の場合は%gを使用して文字列に変換されます。 たとえば、コマンド

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

両方とも1を返します。最初の比較は整数比較を使用して行われ、2番目の比較は2番目のオペランドが文字列18に変換された後に文字列比較を使用して行われます。 Tclは可能な限り値を数値として扱う傾向があるため、実際には文字列の比較を行い、オペランドの値は任意にすることができる場合は==などの演算子を使用することはお勧めできません。 このような場合は、代わりに文字列コマンドを使用する方が良いでしょう。

パフォーマンスに関する考慮事項

最も速いスピードと最小のストレージ要件のために、中括弧で式を囲みます。 これにより、Tclバイトコードコンパイラは最適なコードを生成することができます。

上で述べたように、式はTclパーサで1回、 exprコマンドで2回置換されます。 たとえば、コマンド

3 セットを 設定する。 {$ a + 2} expr $ b * 4

これは、Tclパーサーが最初に変数b$ a + 2を代入してからexprコマンドが式$ a + 2 * 4を評価するためです。

ほとんどの表現は、2回目の置換を必要としません。 それらが中括弧で囲まれているか、そうでなければ、それらの変数とコマンド置換は、それ自体が置換を必要としない数字または文字列を生成する。 しかし、いくつかの宣言されていない式は2回の置換を必要とするため、バイトコードコンパイラはこの状況を処理するための追加の命令を発行する必要があります。 最も費用のかかるコードは、コマンドの置換を含む見えにくい式に必要です。 これらの式は、式が実行されるたびに新しいコードを生成することによって実装する必要があります。

キーワード

算術、 ブール 、比較、式、ファジー比較

重要: manコマンド( %man )を使用して、特定のコンピュータでコマンドがどのように使用されているかを確認してください。