名
expr - 式を評価する
シノプシス
expr arg ? arg arg … ?
連結 arg (それらの間にセパレータスペースを追加する)、結果をTcl式として評価し、その値を返します。 Tcl式で許可される演算子は、C式で許可される演算子のサブセットであり、対応するC演算子と同じ意味と優先順位を持ちます。式はほとんどの場合、数値結果(整数または浮動小数点値)を生成します。例えば、式
expr 8.2 + 6
14.2と評価される。 Tcl式は、C式とはオペランドの指定方法が異なります。また、Tcl式は、非数値のオペランドと文字列の比較をサポートしています。
オペランド
Tcl式は、オペランド、演算子、およびかっこの組み合わせで構成されます。オペランドと演算子とかっこの間に空白を使用できます。式の指示によって無視されます。可能であれば、オペランドは整数値として解釈されます。整数値は、10進数(通常の場合)、8進数(オペランドの最初の文字が0)、または16進数(オペランドの最初の2文字が0x)。オペランドが上記の整数フォーマットのいずれかを持たない場合は、それが可能であれば浮動小数点数として扱われます。浮動小数点数は、ANSI準拠のCコンパイラが受け入れる方法で指定できます(ただし、f, F, l、および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を返します。ブール値と数値(整数または浮動小数点)のオペランドにのみ有効です。
バツ ? y : z
If-then-else、Cのように バツ 非ゼロと評価された場合、結果は次の値になります。 y 。それ以外の場合、結果は次の値になります。 z 。ザ バツ オペランドには数値が必要です。
各オペレーターが作成した結果の詳細については、Cマニュアルを参照してください。すべてのバイナリ演算子は、同じ優先順位レベル内で左から右にグループ化されます。たとえば、コマンド
expr 4 * 2 <7
0を返します。
ザ&&, ||、および?: 演算子はCと同様に ``遅延評価 ''をします。つまり、結果を決定するためにオペランドが評価されない場合、評価されません。たとえば、コマンド
expr {$ v? a:b}
1つだけのa またはb の値に応じて実際に評価されます$ v。ただし、これは、式全体が中括弧で囲まれている場合にのみ当てはまります。それ以外の場合、Tclパーサーはa そしてb を呼び出す前にexpr コマンド。
数学関数
Tclは、式で次の数学関数をサポートしています。
abs コッシュログsqrt アコース ダブルlog10サンド アシン 経験捕虜タン 日焼け 床ランドタン atan2 fmod円形 天井 低音罪 cos intシン
abs( arg )
の絶対値を返します。 arg . Arg 整数または浮動小数点のいずれかであり、結果は同じ形式で返されます。
acos( arg )
円弧余弦を返します。 arg 、0、πラジアンの範囲である。 Arg -1,1の範囲内でなければなりません。
アシン( arg )
アークサインを返します。 arg -pi / 2、π/ 2ラジアンの範囲内にある。 Arg -1,1の範囲内でなければなりません。
日焼け( arg )
アークタンジェントを返します。 arg -pi / 2、π/ 2ラジアンの範囲内にある。
atan2( x、y )
アークタンジェントを返します。 y / バツ -pi、πラジアンの範囲である。 バツ そして y 両方とも0になることはできません。
セイル arg )
最小の整数値を返します。 arg .
cos( arg )
余弦を返します。 arg ラジアンで測定した。
cosh( arg )
双曲線コサインを返します。 arg 。結果がオーバーフローを引き起こす場合は、エラーが戻されます。
ダブル( arg )
もし arg 浮動小数点値です。 arg 、そうでなければ変換する arg フローティングに変換し、変換された値を返します。
exp( arg )
の指数を返します。 arg 、e **として定義される arg 。結果がオーバーフローを引き起こす場合は、エラーが戻されます。
床( arg )
最大の整数値を返します。 arg .
fmod( x、y )
除算の浮動小数点剰余を返します。 バツ によって y 。もし y 0の場合、エラーが返されます。
ハイポ( x、y )
直角三角形の斜辺の長さを計算します( バツ * バツ + y * y ).
int( arg )
もし arg 整数値です。 arg 、そうでなければ変換する arg 切り捨てによって整数に変換し、変換された値を返します。
ログ( arg )
自然対数を返します。 arg . Arg 正の値でなければなりません。
log10( arg )
基数10の対数を返します。 arg . Arg 正の値でなければなりません。
捕虜( x、y )
の値を計算する バツ 力に上がった y 。もし バツ 負の場合、 y 整数値でなければなりません。
rand()
ゼロからちょうど1未満の浮動小数点数、または数学的には範囲0,1を返します。シードは、機械の内部時計から来るか、サンド機能でマニュアルに設定することができます。
円形( arg )
もし arg 整数値です。 arg 、そうでなければ変換する arg 丸めて整数に変換し、変換した値を返します。
罪( arg )
正弦を返します。 arg ラジアンで測定した。
シン( arg )
双曲線正弦を返します。 arg 。結果がオーバーフローを引き起こす場合は、エラーが戻されます。
sqrt( arg )
の平方根を返します。 arg . Arg 非負でなければなりません。
サンド arg )
ザ arg は整数でなければならず、乱数ジェネレータのシードをリセットするために使用されます。そのシードから最初の乱数を返します。各インタプリタにはそれぞれ独自のシードがあります。
タン( arg )
接線を返します。 arg ラジアンで測定した。
タン( 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.
文字列操作
比較演算子のオペランドには文字列値を使用できますが、式エバリュエーターは可能な限り比較を整数または浮動小数点として試行します。比較のオペランドの1つが文字列であり、もう1つが数値である場合、数値オペランドはCを使用して文字列に変換されます sprintf 書式指定子%d 整数と%g 浮動小数点値の場合たとえば、コマンド
expr {"0x03"> "2"} expr {"0y" <"0x12"}
両方とも1を返します。最初の比較は整数比較を使用して行われ、2番目の比較は2番目のオペランドが文字列に変換された後に文字列比較を使用して行われます18。 Tclは可能な限り値を数値として扱う傾向があるため、一般には次のような演算子を使用することはお勧めできません==あなたが実際に文字列の比較をしたいとき、そしてオペランドの値は任意であるかもしれません。これらのケースでは、文字列 代わりにコマンド。
パフォーマンスに関する考慮事項
最も速いスピードと最小のストレージ要件のために、中括弧で式を囲みます。これにより、Tclバイトコードコンパイラは最適なコードを生成することができます。
前述のように、式は2回置換されます.1回はTclパーサで、もう1回は expr コマンド。たとえば、コマンド
3を設定する セットb {$ a + 2} expr $ b * 4
4の倍数ではなく、11を返します。これは、Tclパーサが最初に$ a + 2 変数のためにb、 そうしてexpr コマンドは式を評価します$ a + 2 * 4.
ほとんどの表現は、2回目の置換を必要としません。それらが中括弧で囲まれているか、そうでなければ、それらの変数とコマンド置換は、それ自体が置換を必要としない数字または文字列を生成する。しかし、いくつかの宣言されていない式は2回の置換を必要とするため、バイトコードコンパイラはこの状況を処理するための追加の命令を発行する必要があります。最も費用のかかるコードは、コマンドの置換を含む見えにくい式に必要です。これらの式は、式が実行されるたびに新しいコードを生成することによって実装する必要があります。
キーワード
算術、ブール、比較、式、ファジー比較
重要: 使用 おとこ コマンド( % おとこ 特定のコンピュータでどのようにコマンドが使用されているかを確認することができます。