Fügen Sie eine Bedingungsprüfung und eine Variablenzuweisung in eine ‘if’-Anweisung ein
Lesezeit: 3 Minuten
deddebme
Ich schaue mir einen alten C-Code an und bin verwirrt. Es ist so etwas wie:
UINT A, B = 1;
if((A = B) == 1) {
return(TRUE);
} else {
return(FALSE);
}
Wir alle wissen, dass es eine Compiler-Warnung geben wird, wenn wir if(A = B) machen, aber hier sieht es so aus, als würde das ‘if’ A gegen 1 prüfen. Liege ich richtig?
Ferdinand Beyer
Zuerst weist es den Wert von zu B zu A (A = B), dann prüft es, ob das Ergebnis dieser Zuweisung, nämlich A und wertet zu 1entspricht 1.
Technisch hast du also recht: Unterwegs prüft es A gegen 1.
Zur besseren Lesbarkeit ist der Code äquivalent zu:
UINT A, B = 1;
A = B;
if(A == 1){
return(TRUE);
} else {
return(FALSE);
}
Nur weil Sie den Code so schreiben können, wie er in der Frage geschrieben wurde, heißt das nicht, dass Sie das tun sollten. Sie sollten den in dieser Antwort geschriebenen Code immer bevorzugen, da er keine Mehrdeutigkeit aufweist.
– David Heffernan
28. Juli 2011 um 15:03 Uhr
Wie ist das Original mehrdeutig? Es war dir klar, es war mir klar.
– bash05
7. Juni 2013 um 1:04 Uhr
Es ist nützlich, es so zu schreiben, wie es in der Frage steht, in den Fällen, in denen Ihre Ergebnisaussagen diese Zuordnung möglicherweise vornehmen müssen. An der Oberfläche spart es Ihnen den Speicher-/Datenbankzugriff (wobei Sie erkennen, dass der Compiler schlau genug sein könnte, dies unter der Haube zu tun).
– Lanze Roberts
30. September 2019 um 22:17 Uhr
Vielmehr weist Ihr Code immer zu B zu Aund es wird außerdem geprüft, ob der Wert von B (und damit auch A) entspricht 1.
Daran ist nichts “veraltet”, dies ist im Allgemeinen eine ziemlich praktische Redewendung, wenn Sie das Ergebnis einer Operation benötigen, aber auch nach Fehlern suchen möchten:
int result;
if ((result = foo()) != -1)
{
printf("The result is: %i\n", result);
}
else
{
// panic
}
Ja, Ihr foo()-Check ist genau wie dieser fopen()-Check. Der Code, den ich hier sehe, ist etwas komplizierter, was mich etwas verwirrt hat …
– deddebme
28. Juli 2011 um 14:26 Uhr
Wenn Sie es auf 1 Zeile halten möchten:
if ((A = B), A == 1)
macht das gleiche.
Wir versuchen, if-Anweisungen zu vermeiden, um den Code lesbarer zu machen.
UINT A, B = 1;
bool fResult = false;
fResult = (A == B);
return(fResult);
Und wenn es eine Bedingung geben muss, um bei (Nicht-)Gleichheit zu handeln, siehe dieses Beispiel.
UINT A, B = 1;
bool fResult = false;
fResult = (A == B);
if(fResult)
{
doThis();
}
else
{
doThat();
}
return(fResult);
Sander DeDycker
Richtig. Der Wert A hat, nachdem die Zuordnung verglichen werden muss 1.
Dieses Codebeispiel entspricht nur:
return (TRUE);
Genau. Ich frage mich, ob es eine Situation geben würde, in der die Zuweisung fehlschlagen würde. Es ist sinnvoll, wenn die Überprüfung auf den Rückgabewert einer Funktion erfolgt, wie Kerrek SB erwähnt.
– itisravi
30. Juli 2011 um 6:00 Uhr
Ich gehe davon aus, dass die Frage erfunden ist, um dies zu zeigen. B wäre normalerweise unbekannt.
– bash05
7. Juni 2013 um 1:05 Uhr
Genau. Ich frage mich, ob es eine Situation geben würde, in der die Zuweisung fehlschlagen würde. Es ist sinnvoll, wenn die Überprüfung auf den Rückgabewert einer Funktion erfolgt, wie Kerrek SB erwähnt.
– itisravi
30. Juli 2011 um 6:00 Uhr
Ich gehe davon aus, dass die Frage erfunden ist, um dies zu zeigen. B wäre normalerweise unbekannt.
– bash05
7. Juni 2013 um 1:05 Uhr
14373400cookie-checkFügen Sie eine Bedingungsprüfung und eine Variablenzuweisung in eine ‘if’-Anweisung einyes