2017-03-21 1 views
-11

Warum dieser Code 1 produzieren? Jemand, beschreibe es für mich, bitte.Warum produziert dieser Code 1?

#include <iostream> 

using namespace std; 

int main(){ 
    int x = 0; 
    int y = 0; 

    if (x++&&y++){ 
    y += 2; 
    } 
    cout << x + y << endl; 

    return 0; 
} 
+5

Welches Ergebnis haben Sie erwartet? – TZHX

+2

Denken Sie daran, dass die booleschen Operatoren * eine Kurzschlussauswertung * verwenden. Und dass die Post-Inkrement-Operatoren den * ursprünglichen * Wert (vor Inkrement) zurückgeben. Und diese Null ist gleich "falsch". –

Antwort

7
  • Zunächst x und y 0
  • Deshalb x ++ falsch ergibt, und der zweite Operand von & & wird nie ausgewertet. x ++ erhöht x auf 1. Da die Bedingung falsch ist, wird die bedingte Verzweigung nicht eingegeben.
  • x + y 1 + 0, die gleich 1
2

user2079303 erklärt schön (+1 von mir bereits), als Erweiterung, ich werde ein wenig mehr ins Detail gehen:

if(x++) auswertet der Wert von x vor die Inkrementierung, so dass dieses kleine Stück Code ist an folgenden Äquivalent (Notwendigkeit, den alten Wert zu puffern!):

int tmp = x; 
x++; 
if(tmp) 

beachten Sie, dass innerhalb von c && cc, die zweite Bedingung cc wird nicht mehr ausgewertet, wenn c bereits falsch ist! So ist if(x && y) entspricht

if(x) 
{ 
    if(y) 
    { 
     // ... 
    } 
} 

alles Putting zusammen, ist der Code dieser Variante äquivalent, wo ich die if-Klausel in Codezeilen jedes nur eine einzige Anweisung enthält, getrennt:

int x = 0; 
int y = 0; 

int tmp = x; 
x++; 
if(tmp) 
{ 
    tmp = y; 
    y++; 
    if(tmp) 
     y += 2; 
} 

Angenommen , Ihre Ausgabe ist jetzt ziemlich offensichtlich ...