1

私はTCLプログラミングにかなり慣れていないので、基本を理解することで、次のコードスニペットに遭遇しました。

set x 0;
while "$x < 3" {
    set x [expr $x + 1]
    if {$x >6} break;
    if "$x > 2" continue;
    puts "x is $x"; 
    }
puts "exited second loop with X equal to $x\n"

実行すると、結果は次のようになります。

xは1です
xは2
であり、Xは7に等しい2番目のループを終了します

私が驚いたのは、continueコマンドを実行すると、whileループテスト(x <3)が評価されていないように見えることです。ただし、tclのマンページには、「本文内のcontinueステートメントはコードの実行を停止し、テストが再評価される」と記載されています。

私は何が欠けていますか?

4

1 に答える 1

9

「$x<3」で引用符を使用したため、その条件を評価するのは1回だけです。つまり、tclインタープリターによって最初に確認されたときに、テストは「0<3」になります。それは常に真実なので、[ブレーク]したときにのみwhileループの本体を終了します。

while条件に引用符""の代わりに中括弧{}を使用すると、そのテストはwhileループ自体によってのみ評価され、tclインタープリターの置換パスによっては評価されず、期待どおりに実行されます。

経験則:if / while / forなどのテストでは常に{}を使用します(最初に述べた動作が探しているものでない限り)。

于 2010-12-22T14:15:47.250 に答える