2017-06-30 10 views
0

Wir haben eine Schulaufgabe, C-Kommentare aus einer C-Code-Datei zu entfernen.Sehr verwirrende while-loop Bedingung

Es ist ein Ansatz für diese Aufgabe durch die Eingabedatei und Schleife, bis der Block Kommentar Ende zu gehen

*/ 

kommt.

Warum dieser Code Arbeit,

while(!(input[i] == '*' && input[i+1] == '/')) 
{ 
    i++; 
} 

Aber dies nicht tut?

while(input[i] != '*' && input[i+1] != '/') 
{ 
    i++; 
} 

Die zweite Variante geht aus irgendeinem Grund nie in die Schleife. Ich habe versucht, darüber nachzudenken, konnte aber nicht den Grund dafür finden, warum sie nicht gleich funktionieren.

Antwort

3

!(something AND something) sind NAND Tore, und sie können

So in Ihrem Fall

while (!(input[i] == '*' && input[i+1] == '/')) { 

ist die gleiche wie

//Pick your syntax from these 2 options 
while (input[i] != '*' || input[i+1] != '/') 
while (!(input[i] == '*') || !(input[i+1] == '/')) 

Wie Übergang-!something OR !something ausgedrückt werden aus Und T o ODER funktioniert.

Betrachten Sie nun, Sie haben NAND, die UND-Gatter sind, die NICHT-Gattern mit den Eingängen X und Y folgen. Das Ergebnis ist negiertes UND beider Eingänge. Zur Trennung beide Eingänge zu OR, müssen Sie diese Schritte durchführen:

 ____  __ 
x --| \ | \ 
    | AND |---|NOT|--- (NAND) 
y --|____/ |__/ 
  • ändern und OR
  • nicht entfernen, indem Sie entweder entfernen Tor oder negieren Ausgang wieder
  • Negieren jeder Eingang separatelly

Und dann erhalten Sie:

x --- NOT GATE --- \ 
         -- OR GATE -- NOT (from NAND) -- NOT (negate output) 
y --- NOT GATE ---/
  • Wenn Sie das Gegenteil machen wollen, können Sie es tun (NOR und AND), tauschen Sie einfach OR und AND erneut und alle anderen Schritte.
+0

Danke für die Klärung. Es fühlt sich einfach zu logisch an, es in etwas zu stecken! Was falsch ist. –

0

Die Schleifentestbedingung hat eine UND-Ausdruck, wo die erste oder linke Seite des Ausdrucks ausgewertet wird zuerst sehen, ob wir auch die zweiten überprüfen müssen (Wenn es falsch ist, bedeutet, dass wir muss nicht die zweite als False && anything = False überprüfen).

Hier ist die erste Bedingung input[i] != '*'. Wenn das Zeichen nicht am Anfang der Zeile steht, wird die Schleife bei der ersten Ausführung selbst beendet.

0

sollte es OR und nicht AND, sein

while (input[i] != '*' || input[i+1] != '/') 

wenn ich nicht * Star ist, dann kann es nicht Block Kommentar sein. wenn ich Stern * dann wenn i + 1 ist nicht Schrägstrich '/' dann kann es nicht Block Kommentar sein.

0

Sie bei der ersten Anweisung testen ...

(input[i] == '*' && input[i+1] == '/') 

Wenn das ausgewertet! Wahren Sie die Schleife ein. Damit das stimmt, muss einer Ihrer Ausdrücke fehlschlagen.

In der zweiten Anweisung Sie testen ...

input[i] != '*' && input[i+1] != '/' 

Wenn dies auf true geben Sie die Schleife. Dafür müssen Sie beide Ihre Ausdrücke zum Erfolg führen.

1

Ihre Fragen, indem sie in einer Wahrheitstabelle Tabelle von einem NAND-Gatter

input[i] input[i+1] Output 
    0   0  1 
    0   1  1 
    1   0  1 
    1   1  0 

Während

while(input[i] != '*' && input[i+1] != '/') 
{ 
    i++; 
} 

eine Wahrheitstabelle erzeugt

while(!(input[i] == '*' && input[i+1] == '/')) 
{ 
    i++; 
} 

erzeugt eine Wahrheit beantwortet werden konnte eines NOR-Gatters

input[i] input[i+1] Output 
    0   0  1 
    0   1  0 
    1   0  0 
    1   1  0 

Jetzt können Sie leicht sehen, warum die zwei While-Schleife zwei verschiedene Ergebnisse erzeugt.

+0

Dies verdeutlicht die Situation viel mehr. Danke für den Tisch. –