Fügen Sie eine Bedingungsprüfung und eine Variablenzuweisung in eine ‘if’-Anweisung ein

Lesezeit: 3 Minuten

Benutzeravatar von deddebme
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?

Benutzeravatar von Ferdinand Beyer
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);

Benutzeravatar von Sander De Dycker
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

1437340cookie-checkFügen Sie eine Bedingungsprüfung und eine Variablenzuweisung in eine ‘if’-Anweisung ein

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy