2017-09-07 3 views
0

ちょうど$ argcのはどちらか1または2のTcl:内部の複数の条件文の文

私は試していない場合は、エラーを生成するために...スクリプトの中でいくつかの基本的なチェックをやろうとした場合:

if { ($argc != 1) || ($argc != 2) } { 
     puts "ERROR: \$argc should be either 1 or 2.\n"; exit 1 
} 

if { ($argc != 1 || $argc != 2) } { 
     puts "ERROR: \$argc should be either 1 or 2.\n"; exit 1 
} 

など

しかし、それは括弧のいずれかを使用して動作させることができませんでした/ブレースCOMBINA 。

ご協力いただければ幸いです。

ありがとうございました!

+2

Googleの "ド・モルガンの定理"。論理に関しては、英語は残念なことに非常にゆるやかであり、人々が「どちらも」の概念を変換しようとするときに、ほとんどこの問題が発生します。これについて本当に本当に難しいと思うのであれば(あるいは論理設計やデジタル設計のどちらかを研究していれば)、「1でも2でもない」というのは、実際には「1ではなく2ではない」ということです。 1は2ではないので、「not 1 or not 2」というフレーズは常にTRUEです。したがって、「not 2」の部分は真であり、2は1ではないため、「not 1」部分は真です。あなたが欲しいのは、 "not(1 or 2)"です。 – slebetman

答えて

4

これは基本的なロジックです。

2が1に等しくないため、最初のテストが真であるため、この例は機能しません。

OR結合を否定するには、各テストを否定し、ORをANDに変更します。

if { ($argc == 1) || ($argc == 2) } { 
    puts "ok" 
} else { 
    puts "ng" 
} 

だから使用:

if { ($argc != 1) && ($argc != 2) } { 
    # i.e. if $argc is either anything other than a 1 or a 2... 
    puts "ERROR: \$argc should be either 1 or 2.\n"; exit 1 
} 
+3

あるいは! ($ argc == 1 || $ argc == 2) 'これは同等です。 '! (A || B) '〜' A &&!B'はDe Morganの定理として知られています(基本的に '!(A || B)===!A &&!B') – slebetman

3

別の方法:のargcの値がある場合にリストが1を含まない:ある

if {$argc ni {1 2}} { ... } 

あなたはこのような状態にしたいです2、...

niオペレータにはTcl 8.5以降が必要です。

ドキュメント: ifni (operator)

+0

私はこれが好きです。非常によく読んで理解しやすい。 –