Komische Zeile, kann sie mir wer erklären?
-
(void) (var1 == 0 || printf("Null"));
Kann mir da jemand die Syntax davon erklären?
Und eine weitere Frage hätte ich noch, es ist ja bekannt, dass man double-Werte nicht ohne Delta vergleichen sollte. Gilt dies auch bei:
double x = 1.0; if (x == 1){ ... }
-
@regnes sagte in Komische Zeile, kann sie mir wer erklären?:
(void) (var1 == 0 || printf("Null"));
Da steht ein OR oder? Welche Schlüsse ziehst Du daraus? Stichwort: Short-Circuit Evaluation.
@regnes sagte in Komische Zeile, kann sie mir wer erklären?:
Und eine weitere Frage hätte ich noch, es ist ja bekannt, dass man double-Werte nicht ohne Delta vergleichen sollte. Gilt dies auch bei:
https://www.c-plusplus.net/forum/topic/351743/rechnung-gibt-falsches-ergebnis/37
-
Um die Zeile zu verstehen muss man ein paar Dinge wissen:
- Der eingebaute
||
Operator hat in C++ "short circuit evaluation". D.h. der rechte Ausdruck wird garantiert nur ausgewertet wenn der linke "false" war. - "Wird nicht ausgewertet" heisst bei Funktionen: die werden nicht ausgeführt.
printf
hat einen Returnwert (int
)int
lässt sich implizit nachbool
konvertieren
- Der eingebaute
-
@hustbaer Der cast dürfte überflüssig sein?
-
@regnes sagte in Komische Zeile, kann sie mir wer erklären?:
Und eine weitere Frage hätte ich noch, es ist ja bekannt, dass man double-Werte nicht ohne Delta vergleichen sollte. Gilt dies auch bei:
double x = 1.0; if (x == 1){ ... }
Nein, das gilt da nicht.
1.0 ist exakt abbildbar, und so lange du damit nicht rumrechnest bleibt 1.0 auch immer 1.0.
Dein "if" muss also immer betreten werden. Dass du zum Test einenint
Literal verwendest (1) statt einesdouble
Literals (1.0) spielt dabei keine rolle. Das wird automatisch konvertiert und muss in dem Fall auch exakt konvertiert werden.
-
@hustbaer sagte in Komische Zeile, kann sie mir wer erklären?:
Nein, das gilt da nicht.
oh f*ck. Ich hätte den Code doch lesen sollen ^^
-
danke @hustbaer
aber wo liegt der Unterschied zu einer normalen if? bzw. warum sollte ich das verwenden?
-
@Swordfish Ja, der Cast ist überflüssig.
Ich konnte jetzt auf die Schnelle keinen Compiler finden der ohne Cast eine Warning ausgibt, aber das wäre ein Grund den ich mir vorstellen könnte.
Oder es ist "Konvention" in dem Projekt bei dieser speziellen Abartigkeit einen Cast zu schreiben.
-
@hustbaer sagte in Komische Zeile, kann sie mir wer erklären?:
Oder es ist "Konvention" in dem Projekt bei dieser speziellen Abartigkeit einen Cast zu schreiben.
Der cast to void wird üblicherweise nur dazu verwendet Compiler Warnungsmäßig ruhig zu stellen. Im gegebenen Fall sehe ich aber keinen Grund für eine Warnung.
-
@regnes sagte in Komische Zeile, kann sie mir wer erklären?:
danke @hustbaer
aber wo liegt der Unterschied zu einer normalen if?Es ist schlechter lesbar.
bzw. warum sollte ich das verwenden?
Grundsätzlich solltest du das nicht verwenden.
Es gibt IMO genau eine Verwendung wo sowas mehr oder weniger OK ist, und das sind Makros die ein "if" brauchen und so wenig Overhead wie möglich haben sollen.Ala
#define MY_ASSERT(expression) ((void)((expression) || onFailedAssertion(#expression)))
Man könnte das auch als
#define MY_ASSERT(expression) do { if (!expression) onFailedAssertion(#expression); } while (false)
implementieren. Allerdings gab es da Compiler die es nicht immer geschafft haben den do-while-false Loop wegzuoptimieren. Ich weiss nicht ob das heute noch relevant ist, vielleicht gibt's noch ein paar Embedded-Systems wo man mit solchen Compilern arbeitet.
-
@regnes sagte in Komische Zeile, kann sie mir wer erklären?:
Und eine weitere Frage hätte ich noch, es ist ja bekannt, dass man double-Werte nicht ohne Delta vergleichen sollte. Gilt dies auch bei:
double x = 1.0;if (x == 1){
...
}Ist die Frage, ob der compiler dabei das x in einen integer downcastet oder umgekehrt. sollte aber in beiden fällen gehen, schätze ich mal.
-
@Swordfish sagte in Komische Zeile, kann sie mir wer erklären?:
@hustbaer sagte in Komische Zeile, kann sie mir wer erklären?:
Oder es ist "Konvention" in dem Projekt bei dieser speziellen Abartigkeit einen Cast zu schreiben.
Der cast to void wird üblicherweise nur dazu verwendet Compiler Warnungsmäßig ruhig zu stellen. Im gegebenen Fall sehe ich aber keinen Grund für eine Warnung.
Naja man berechnet da einen
bool
Wert den man nicht braucht. Im Prinzip das selbe wieint fun(); void test() { fun() + fun(); }
Wo z.B. Clang dann sagt:
<source>:4:11: warning: expression result unused [-Wunused-value] fun() + fun(); ~~~~~ ^ ~~~~~
-
@A-Grau sagte in Komische Zeile, kann sie mir wer erklären?:
@regnes sagte in Komische Zeile, kann sie mir wer erklären?:
Und eine weitere Frage hätte ich noch, es ist ja bekannt, dass man double-Werte nicht ohne Delta vergleichen sollte. Gilt dies auch bei:
double x = 1.0;if (x == 1){
...
}Ist die Frage, ob der compiler dabei das x in einen integer downcastet oder umgekehrt. sollte aber in beiden fällen gehen, schätze ich mal.
Naja ne also es ist schon definiert was da passiert: der
int
wird zudouble
verwandelt und dann die beidendouble
s verglichen.
-
@hustbaer sagte in Komische Zeile, kann sie mir wer erklären?:
Naja ne also es ist schon definiert was da passiert: der int wird zu double verwandelt und dann die beiden doubles verglichen.
Das finde ich gut.
Ist es denn eine allgemeine Regel, dass in C immer in Richtung des Datentyps konvertiert wird, der den größeren Wertebereich aufweist?Btw, ich mache schon ziemlich lange C, aber um die Feinheiten habe ich mich nur gekümmert, wenns Probleme gab.
-
@A-Grau sagte in Komische Zeile, kann sie mir wer erklären?:
Btw, ich mache schon ziemlich lange C,
Ja ne, ist klar. https://en.cppreference.com/w/c/language/conversion
-
@Swordfish sagte in Komische Zeile, kann sie mir wer erklären?:
Ja ne, ist klar.
was stört dich dran?
-
@A-Grau sagte in Komische Zeile, kann sie mir wer erklären?:
@Swordfish sagte in Komische Zeile, kann sie mir wer erklären?:
Ja ne, ist klar.
was stört dich dran?
Es klingt im Zusammenhang wenig glaubwürdig. Aber möglich ist es schon, es gibt immer Leute die etwas Jahre lang machen und sich nicht drum kümmern wie es eigentlich funktioniert.
-
@A-Grau sagte in Komische Zeile, kann sie mir wer erklären?:
Das finde ich gut.
Ist es denn eine allgemeine Regel, dass in C immer in Richtung des Datentyps konvertiert wird, der den größeren Wertebereich aufweist?Jain.
It's complicated.
-
@hustbaer sagte in Komische Zeile, kann sie mir wer erklären?:
Es klingt im Zusammenhang wenig glaubwürdig. Aber möglich ist es schon, es gibt immer Leute die etwas Jahre lang machen und sich nicht drum kümmern wie es eigentlich funktioniert.
Weil es eben funktioniert. Grund zum Nachforschen hat man nur, wen es mal streikt. Wobei ich mich nicht einmal mehr daran erinnern kann, ob es in C etwas gab, das mich richtig genervt hat. 2D-Arrays vielleicht, aber auch das kann man umgehen, indem man sie als a*b-Arrays behandelt, also "flach macht". C ist eine einfache Prog.Sprache die zu schnellen Erfolgen führt. Nicht umsonst gibt es so viele Sprachen die auf der C-Syntax aufsetzen.
Zur Zeit kämpfe ich mich durch Rust, just for fun. Einen wirklichen Vorteil dieser Sprache gegenüber C konnte ich noch nicht entdecken. Das Borrow-Checking finde ich bisher eher nervig.
-
@A-Grau sagte in Komische Zeile, kann sie mir wer erklären?:
C ist eine einfache Prog.Sprache die zu schnellen Erfolgen führt
Damit dürftest Du deinen Troll-Stempel endgültig bekommen haben.
-
@A-Grau sagte in Komische Zeile, kann sie mir wer erklären?:
@hustbaer sagte in Komische Zeile, kann sie mir wer erklären?:
Es klingt im Zusammenhang wenig glaubwürdig. Aber möglich ist es schon, es gibt immer Leute die etwas Jahre lang machen und sich nicht drum kümmern wie es eigentlich funktioniert.
Weil es eben funktioniert.
Woher willst du denn wissen ob es funktioniert, wenn du die genauen Regeln nicht kennst? Schreibst du Unit-Tests für alles die alle erdenklichen Corner-Cases abdecken?