2017-09-07 1 views
0

Juste essayer de faire un peu de vérification de base dans un script ... pour produire une erreur si $ argc est pas 1 ou 2.Tcl: multiples conditionals à l'intérieur de l'instruction if

J'ai essayé:

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

et

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

etc.

mais n'a pas pu le faire fonctionner en utilisant l'un des parenthèses/accolade combina tions.

Toute aide serait grandement appréciée.

Merci!

+2

Google "Le Théorème de De Morgan". L'anglais est malheureusement très laxiste quand il s'agit de logique et je vois ce problème surtout quand les gens essaient de convertir le concept de "ni". Si vous pensez VRAIMENT VRAIMENT DURE à ce sujet (ou si vous aviez étudié la logique ou le design numérique) vous auriez réalisé que "ni 1 ni 2" signifie "pas 1 et non 2" au lieu de "pas 1 ou pas 2". La phrase "not 1 ou not 2" par définition est TOUJOURS VRAI car 1 n'est pas 2 donc la partie "ou pas 2" est vraie et 2 n'est pas 1 donc la partie "non 1" est vraie. Ce que vous voulez, c'est "not (1 or 2)" – slebetman

Répondre

4

Ceci est une logique de base.

Votre exemple ne fonctionnera pas car 2 n'est pas égal à 1, donc le premier test est vrai.

Pour annuler une conjonction OR, annulez chaque test et remplacez le OU par un ET. Vous voulez cet état:

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

Il faut donc utiliser:

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

Alternativement '! ($ argc == 1 || $ argc == 2) 'qui est équivalent. La transformation entre '! (A || B) 'à'! A &&! B' est connu comme le théorème de De Morgan (essentiellement '! (A || B) ===! A &&! B') – slebetman

3

Une autre façon:

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

C'est: si la valeur de argc est pas la liste contenant 1 et 2, ...

Le ni opérateur nécessite Tcl 8.5 ou plus tard.

Documentation: if, ni (operator)

+0

J'aime ça. Ça se lit très bien, facile à comprendre. –