Perché i linguaggi di livello superiore non hanno né operatori di xor né di cortocircuito?

3

Mentre molti linguaggi di livello superiore hanno bit per bit (esclusivo o) e bit per bit (esclusivo e), ad esempio C, C ++, Java, ecc. Sono curioso di sapere perché ( molto più utile ) < a href="http://en.wikipedia.org/wiki/Short-circuit_evaluation"> gli operatori logici di cortocircuito non hanno questa funzionalità? È semplicemente dovuto alla capacità di essere in grado di concatenare la logica attraverso l'uso di "non"?

Questa domanda riguarda principalmente le considerazioni sulla progettazione del linguaggio ...

    
posta Stumbler 30.03.2014 - 15:35
fonte

4 risposte

13

Binary

Nand

Guarda come la NAND può essere implementata con solo porte AND o OR.

NAND diventa uno di:

!(a && b)
!a || !b

Ciascuno di questi può essere visto come corto circuito. La ragione per cui la NAND non esiste è che è facilmente riscritta come not(a and b)

Xor

XOR, è nel suo cuore, un controllore di parità. Per verificare la parità di due valori, è necessario testare entrambi i valori. Questo è il motivo per cui non è fondamentalmente in grado di cortocircuitarlo - non puoi convalidare se il valore è vero o falso fino a quando non testerai tutti i valori.

Guarda come XOR è scritto con le porte AND e OR:

(a || b) && !(a && b)

Se a è vero, la parte OR di xor può essere cortocircuitata, tuttavia significa anche che la parte AND non può essere cortocircuitata.

N-ario

Gli operandi N-ary accettano un numero qualsiasi di input (rispetto a quelli binari che ne prendono solo due).

Nand

L'n-ary NAND è

!(a && b && c && d ... )

Questo può ancora essere cortocircuitato in quanto non appena uno degli operandi diventa falso, il valore della NAND è vero.

Xor

Ci sono due diverse interpretazioni di n-ary xor:

  1. Un numero dispari di operando vero
  2. Uno e un solo operando vero

Il primo è in uso comune (vedi XOR in Wolfram ):

For multiple arguments, XOR is defined to be true if an odd number of its arguments are true, and false otherwise. This definition is quite common in computer science, where XOR is usually thought of as addition modulo 2.

Da Wikipedia

Strict reading of the definition of exclusive or, or observation of the IEC rectangular symbol, raises the question of correct behaviour with additional inputs. If a logic gate were to accept three or more inputs and produce a true output if exactly one of those inputs were true, then it would in effect be a one-hot detector (and indeed this is the case for only two inputs). However, it is rarely implemented this way in practice.

Il xor "uno caldo" può essere cortocircuitato quando si valuta l'espressione quando si trova il valore vero secondo .

Altrimenti, di nuovo, lo XOR è più comunemente implementato come il "numero dispari di valori veri" che funge da controllore di parità e richiede la valutazione di tutti gli operandi per determinare la verità dell'espressione poiché l'ultimo valore valutato può sempre cambia la verità dell'espressione.

    
risposta data 30.03.2014 - 19:11
fonte
13

NAND è o !a || !b o !(a && b) entrambi saranno cortocircuitati quando a è falso.

XOR non può essere cortocircuitato affatto come @ delnan spiegato

    
risposta data 30.03.2014 - 15:41
fonte
3

Perl6 ha un cortocircuito XOR ma il suo significato di XOR è specifico. Ho ripetuto il mio commento jist qui: ci sono due significati di XOR:

  1. se il conteggio degli argomenti veri è dispari
  2. se solo esattamente un argomento è vero

Esempio di differenza: XOR (True, True, True)True con il 1o significato e False con il 2o significato. Se la macchina Perl6 rileva che almeno 2 argomenti sono veri, interrompe la valutazione del riposo perché il risultato è già stato determinato come False.

Tuttavia, per il primo significato (più tradizionale), non è possibile determinare il risultato finale finché tutti gli argomenti non vengono valutati.

Penso che dovremmo inventare termini speciali di chiarimento per queste varianti XOR, anche se non saranno usati al di fuori di questa discussione.

    
risposta data 30.03.2014 - 16:19
fonte
2

La risposta breve è perché la tabella di verità per XOR non ha una singola riga di True o False.

  • Se il primo argomento su OR è True, la risposta è True, indipendentemente dal secondo argomento.

  • Se il primo argomento di AND è False, la risposta è False indipendentemente dal secondo argomento.

  • MA Se il primo argomento di XOR è True o False, ha ancora bisogno del secondo argomento perché il valore di verità potrebbe "capovolgere":

True OR ? = True (always)

False AND ? = False (always)

True XOR ? = False or True

False XOR ? = True or False

    
risposta data 30.03.2014 - 16:29
fonte

Leggi altre domande sui tag