Komische Zeile, kann sie mir wer erklären?
-
@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?
-
@hustbaer sagte in Komische Zeile, kann sie mir wer erklären?:
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?
Er meint, weil sein Programm nicht abstürzt funktioniert es.
-
@A-Grau sagte in Komische Zeile, kann sie mir wer erklären?:
Weil es eben funktioniert.
Dann gib mir mal deinen Source und ich zeige dir, wo du überall UB hast;
ich schätze mal aus Erfahrungen bei anderen "C-Profis": mind. alle 3 Zeilen 1x
-
@Wutz sagte in Komische Zeile, kann sie mir wer erklären?:
@hustbaer sagte in Komische Zeile, kann sie mir wer erklären?:
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?
Er meint, weil sein Programm nicht abstürzt funktioniert es.
Mir ist schon klar was er meint. Ich wollte versuchen ihn mit meiner Frage darauf hinzuweisen dass es da noch ein anderes Verständnis von "funktionieren" gibt.
ps: Und ja, selbst wenn er Unit-Tests für alles hätte die alles abdecken wäre immer noch nicht gesagt dass das Programm immer definiertes Verhalten hat. Aber dann könnte man zumindest mit gutem Gewissen behaupten dass es "funktioniert" - zumindest mit genau der Toolchain und genau der Plattform mit denen er entwickelt/testet.
-
@hustbaer @Wutz Jetzt kommt mal wieder runter. So viel wie der sich für grundlegende Spracheigenschaften interessiert hat er von Unit-Tests noch nie gehört.
-
@Swordfish Auch das ist mir klar. Nochmal: das war ein Wink mit dem Zaunpfal in Richtung dass sein "es funktioniert" vielleicht nicht der Weisheit letzter Schluss ist.
-
Warum nicht einfach
if(var) printf("Null");
?
Ein Cast zu
void
wird nur dazu benutzt eine Warnung zu unterdrücken. Bei deinem Beispiel macht das aber keinen Sinn.Beispiel für so ein Cast wäre früher wohl eher ein assert mit einer hart-kodierten Fehlermeldung gewesen.
assert(((void)"Fehlermeldung", false));
-
Dieser Beitrag wurde gelöscht!
-
@hustbaer sagte in Komische Zeile, kann sie mir wer erklären?:
Woher willst du denn wissen ob es funktioniert, wenn du die genauen Regeln nicht kennst?
Weil es tut was ich will. Woher sonst?
Ich mache das nur aus Hobby. Ist nicht so kritisch wenn es mal nicht geht. Dann wird es ausgebessert.