| If - Überprüfung eines Werts hinter && |
|
|
|
| Geschrieben von Mitja Schmakeit | |
| Saturday, 20. October 2007 | |
|
Es ist rein logisch, bei einem If wie
Code:
if (3 == 2 && 5 == 5);
, den Teil nach dem && nicht mehr zu überprüfen. C++ verfährt so, und prüft nur den ersten Teil. Will man dort Funktionen verwenden, die referenzierte Variablen ändern, so sollte man Aufpassen oder sich dies zunutze machen.
Zeigen lässt sich das am besten an einem kompletten Beispiel:
Code:
#include <cstdlib>
#include <cstdio>
#include <iostream>
using namespace std;
bool bla (int *blainc)
{
*blainc = *blainc + 1;
return true;
}
int main(int argc, char *argv[])
{
int i;
i = 3;
cout << "i: " << i << endl;
bla(&i);
cout << "i: " << i << endl;
if (3 == 2 && bla(&i)) { cout << "Das hier erscheint nie." << endl; }
cout << "i: " << i << endl;
system("PAUSE");
return 0;
}
Output:
i: 3
i: 4
i: 4
Drücken Sie eine beliebige Taste . . .
Wie man sieht, wurde bei der If-Abfrage die Funktion bla(&i) NICHT ausgeführt. Darauf sollte man unbedingt achten, wenn man solche Funktionen innerhalb eines Ifs verwendet!
Nützlich kann das ganze allerdings auch werden (wieder ein volles Programm):
Code:
#include <cstdlib>
#include <cstdio>
#include <iostream>
using namespace std;
bool blub (int teileins, int teildurch)
{
if ((teileins/teildurch) > 5) { return true; } else { return false; }
}
int main(int argc, char *argv[])
{
int i, b;
i = 20;
b = 3;
if (blub(i,b)) { cout << "yes" << endl; } else { cout << "no" << endl; }
system("PAUSE");
return 0;
}
Output:
yes
Drücken Sie eine beliebige Taste . . .
Ändern wir jetzt die zuweisung von 3 zu b in Code:
b = 0;
so ergibt das einen Laufzeitfehler, da die Funktion blub ja durch b teilt (Division durch 0). Hier kann man sich das jetzt zunutze machen, indem wir die zeile mit der IF-Abfrage wie folgt ändern:
Code:
if (b != 0 && blub(i,b)) { cout << "yes" << endl; } else { cout << "no" << endl; }
Nun ergibt das keinen Laufzeitfehler mehr, da blub(i,b) ja im Falle von b==0 nicht mehr abgefragt wird. Die Ausgabe ist schlicht:
Output:
no
Drücken Sie eine beliebige Taste . . . |
|
| Letzte Aktualisierung ( Sunday, 10. February 2008 ) |
| Weiter > |
|---|








