Warum ist diese version logischer UND in C nicht zeigen, Kurzschluss-Verhalten?

Ja, das ist eine Hausaufgaben-Frage, aber ich habe meine Forschung getan und einen fairen Betrag von tiefen Gedanken über das Thema und können nicht dies herauszufinden. Die Frage besagt, dass dieses Stück code NICHT aufweisen Kurzschluss-Verhalten und fragt, warum. Aber es sieht für mich, wie es Ausstellung Kurzschluss-Verhalten, so kann sich das jemand erklären warum nicht?

In C:

int sc_and(int a, int b) {
    return a ? b : 0;
}

Sieht es für mich aus, dass in dem Fall, dass a ist false, das Programm wird nicht versuchen, Sie zu bewerten b an alle, aber ich muss falsch sein. Warum tut das Programm auch nur zu berühren b in diesem Fall, wenn Sie nicht haben, um?

  • Wie ist typisch für die meisten künstlich Hausaufgaben Fragen, du wirst nie sehen diese Art von code in ein Produktivsystem, es sei denn, der Programmierer ist, absichtlich zu versuchen, clever zu sein.
  • Du wirst sehen, der code genau so in production systems-alle Zeit! Es ist nicht wahrscheinlich, um eine Funktion mit dem Namen AND(), aber die Funktionen empfangen von Argumenten nach Wert und dann bewerten Sie (oder nicht) abhängig von der Logik der Funktion, die überall zu finden sind. Trotz des seins eine "Fangfrage", es ist eine kritische Verhalten von C zu verstehen. In einer Sprache, die mit call-by-name würde diese Frage eine ganz andere Antwort.
  • Ich war kommentieren Sie den code, nicht das Verhalten. Ja, Sie müssen verstehen, das Verhalten. Nein, Sie brauchen nicht, um code zu schreiben wie dieses.
  • Das ist eigentlich schon ziemlich relevant, wenn Sie einmal die code in VB und Begegnung IIf. Denn es ist eine Funktion eher als ein operator die Evaluierung wird nicht kurzgeschlossen. Dies kann zu Problemen für die Entwickler benutzt, um die Kurzschluss-operator, der dann Sachen schreiben wie IIf(x Is Nothing, Default, x.SomeValue).
  • weil es ein Armutszeugnis für das Bildungssystem.
  • VB hat exakt diese Funktion, genannt IIf. Wir hatten schon ein paar "Ingenieure", die nicht heraus, dass beide Seiten der IIf wurden ausgewertet.
  • Bei Verwendung von Funktionszeigern und überlast für jede option; (bool,bool / bool "fun / Spaß", "bool" / Spaß,Spaß), wäre es dann möglich? gewährt, du würdest die Funktion Zeiger etc im Ausdruck nicht die Funktion selbst, sondern (zwar künstlich) konnte ich sehen, dass es funktioniert.
  • Diese Frage macht mich froh, dass ich fertig bin mit der Schule. 🙂
  • Streng, weder int, 'a' noch 'b' wird 'false', da kein solcher Wert existiert in C. haben Sie zwei int-Werte. Sie beide müssen kopiert werden? Ich nehme an, Sie würden schauen müssen, um den standard zu sehen, ob die Auswertung von 'b' könnte kurzgeschlossen werden. Es scheint, dass eine Laufzeit-Optimierung könnte überspringen Sie die Bewertung "b". Es würde bedeuten, re-ordering code im Aufrufer zu tun, wenn es feststellen könnte, dass " b " nicht notwendig war, auf den Stapel.
  • falsch und wahr in C sind Sätze, nicht um Werte. Insbesondere stimmt die Menge aller nicht-null-Werte. Sie müssen true und false werden in der Lage zu tun, Boolesche Logik, und niemand leugnet Sie tun können, Boolesche Logik in C. Als für das überspringen b ist die Bewertung zwingend für die beobachtbaren Nebenwirkungen (nur).
  • Der ternäre operator nicht Kurzschluss. Sie können dies testen, indem Sie ersetzen a und b mit Funktionen, die umfassen Nebenwirkungen. Beispiel: ideone.com/WHIS2v
  • Es ist erwähnenswert, dass, zusätzlich zu den Mangel an Kurzschluss-Verhalten, das sc_and - Funktion ist nicht äquivalent zu der && Betreiber. sc_and(2, 3) Erträge 3; 2&&3 Erträge 1. (Das Ergebnis hat die gleiche Wahrheit Wert, aber.)

InformationsquelleAutor Bobazonski | 2014-10-13
Schreibe einen Kommentar