2017-09-07 78 views
0

只是盡在腳本中一些基本的檢查...產生一個錯誤,如果$ ARGC不是1或2。的Tcl:內的多個條件語句if語句

我想:

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

谷歌 「德摩根定理」。當談到邏輯時,英語不幸地很鬆懈,而且當人們試圖轉換「既不」的概念時,我也會看到這個問題。如果您認爲對此很難(或者您研究過邏輯或數字設計),您會意識到「既不是1也不是2」實際上意味着「不是1而不是2」而不是「不是1或不是2」。根據定義,短語「不是1或不是2」總是爲「真」,因爲1不是2,因此「或不是2」部分爲真,2不爲1,因此「不是1」部分爲真。你想要的是「不是(1或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

另一種方式:

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

那就是:如果ARGC的值含有以下的列表和2,...

ni運營商需要Tcl 8.5或更高版本。

文檔: ifni (operator)

+0

我喜歡這樣。它讀得很好,很容易理解。 –