Hallo,
ich frage mich gerade was folgender Code bewirkt:
if(0)
{
variable=1;
}
umgekehrt könnte ich auch fragen was würde dann if(1) bedeuten ?
Bei if(1) würde ich sagen, daß die if-Abfrage immer ausgeführt werden
würde, also die variable immer auf 1 gehen würde.
Andersherum würde aber doch dann if(0) niemals erfüllt werden.
VERWIRR
Danke für eure Antworten
Gruß
Karlson
Eigentlich genau das, was du mit if(1) schreibst. Der Code wird immer
ausgeführt, die If-Schleife könnte man sich sparen. Wo hast du das denn
her?
cmfcmf
Karlson vom Dach schrieb:> Bei if(1) würde ich sagen, daß die if-Abfrage immer ausgeführt werden> würde, also die variable immer auf 1 gehen würde.>> Andersherum würde aber doch dann if(0) niemals erfüllt werden.
Richtig.
Auf alle Fälle würden if(0) und if(1) immer konträr zueinander sein.
Also wurscht, welche Anweisung jetzt nichts macht und welche was macht,
kann man sagen daß eine der beiden definitiv nie erfüllt ist.
Christian F. schrieb:> Eigentlich genau das, was du mit if(1) schreibst. Der Code wird immer> ausgeführt, die If-Schleife könnte man sich sparen. Wo hast du das denn> her?
Echter Blödsinn.
1. Die Anweisung "variable=1;" wird nicht ausgeführt, da der Ausdruck
"(0)" nicht wahr ist.
2. Eine "If-Schleife" gibt es nicht.
3. Ein guter Compiler entfernt das ganze Konstrukt.
4. Ein besserer Compiler gibt eine Warnung aus.
5. Ein noch besserer Compiler meldet dich zum nächsten C-Kurs an.
Karlson vom Dach schrieb:> Das steht so in einem SPS-Programm. Ich frage mich nur warum ?
Höre auf zu plenken und sage gleich, dass es eine SPS-Anweisung ist.
Ist doch ganz einfach!
Heinz schrieb:> Christian F. schrieb:>> Eigentlich genau das, was du mit if(1) schreibst. Der Code wird immer>> ausgeführt, die If-Schleife könnte man sich sparen. Wo hast du das denn>> her?>> Echter Blödsinn.>> 1. Die Anweisung "variable=1;" wird nicht ausgeführt, da der Ausdruck> "(0)" nicht wahr ist.
Sag ich doch. Andererseits ist if(123) aber schon wahr. Das hab ich
gerade in VS2010 ausprobiert. Man könnte also sagen, daß alles außer
if(0) wahr ist.
>> 2. Eine "If-Schleife" gibt es nicht.
Gut, ich glaube das weis jetzt jeder
>> 3. Ein guter Compiler entfernt das ganze Konstrukt.
Quatsch
>> 4. Ein besserer Compiler gibt eine Warnung aus.
Schon eher
>> 5. Ein noch besserer Compiler meldet dich zum nächsten C-Kurs an.
Sag ich nichts dazu, weil ich einfach nur wissen wollte, was jemand
damit bezwecken möchte. Der Code wurde nicht generiert. Ich sitzte geade
vor einem ziemlich mächtigem Projekt welches auch astrein funktioniert
und ansonsten ziemlich trickreich programmiert wurde. Wenn du denjenigen
nicht kennst und auch nciht einschätzen kannst, solltest du dir deine
arroganten Kommentare verkneifen.
Es ist keine SPS Anweisung. Sondern C-Code.
Es gibt nämlcih auch SPSen die man in ANSI-C oder auch schon
objektorientiert programmieren kann. Da die meisten aus Unwissenheit
darüber nicht bescheid wissen, denken sie immer automatisch an FUP oder
KOP.
Ja, die Zeiten haben sich geändert.
Mich erinnert das an eine alte Anleitung noch aus Win98-Zeiten. Hier der
Auszug:
[Zitat]
Aber noch mal zum HexView von der WinAmp.Exe, da steht ja
dieses tolle R„tsel am Anfang:
if (billg != satan)
exit(1);
else
ShowNiftyWinamp();
billg: das ist eine wahrhaftige Globale Variable, diese
hat immer den Wert 0 (der Wert berechnet sich irgendwie
aus der Produktqualit„t der Firma)
satan: ist keine globale Variable, sondern eine nur in
Unterweltfunktionen benutzte. Deren Wert kennen wir nicht!
Aber er ist ganz einfach zu berechnen. Dafr wird die
If abfrage einmal nach C++ regeln umgestellt.
if (billg == satan)
ShowNiftyWinamp();
else
exit(1);
Ok, alles beim alten, Bill Gates ist der Satan!
[\Zitat]
Karlson vom Dach schrieb:> Sag ich doch. Andererseits ist if(123) aber schon wahr. Das hab ich> gerade in VS2010 ausprobiert. Man könnte also sagen, daß alles außer> if(0) wahr ist.
Das sind ja nun absolute C-Grundlagen, das 0 unwahr ist, und alles
andere als wahr gilt.
Der Code wird ein Rest aus der Testphase sein.
Es muss nicht immer #if oder /* */ oder // sein.
Für dieses Beispiel mit nur einer Zeile und C ist es ungewöhnlich.
Aber in Programmiersprachen, die keine mehrzeiligen oder verschachtelten
Kommentare kennen, kann man damit diese Einschränkungen umgehen.
if(0) wird gerne verwendet, um Code zeitweise auszukommentieren.
Der Grund ist eine Unzulänglichkeit der C-Kommentar Zeichen /* */, sie
lassen sich nicht verschachteln.
Man kann aber auch #if ... #endif nehmen zum Auskommentieren.
Peter
Karlson vom Dach schrieb:>>>> 3. Ein guter Compiler entfernt das ganze Konstrukt.>> Quatsch
Warum sollte das Quatsch sein? gcc tut das, und das ist gut so.
Rolf Magnus schrieb:> Karlson vom Dach schrieb:>>>>>> 3. Ein guter Compiler entfernt das ganze Konstrukt.>>>> Quatsch>> Warum sollte das Quatsch sein? gcc tut das, und das ist gut
In C macht man sowas besser mit
#if 0
// dead code
#endif
In Java wuerde man sowas z.B. gar nicht schreiben koennen, da der
Compiler keinen toten Code erlaubt -- was ja auch nicht ganz sinnlos
ist.
Stefan Zimmermann schrieb:> CompilerOptimierung == 0Stefan Zimmermann schrieb:> Rolf Magnus schrieb:>> Karlson vom Dach schrieb:>>>>>>>> 3. Ein guter Compiler entfernt das ganze Konstrukt.>>>>>> Quatsch>>>> Warum sollte das Quatsch sein? gcc tut das, und das ist gut> if(CompilerOptimierung == 0)> {> KonstruktInMaschinenCodeUebernehmenAberUeberspringen();> }> else> {> KonstruktEntfernen();> }
Wobei das Ausschalten von Optimierungen wohl eher für Leute ist die ihre
eigenen Bugs nicht finden und hoffen das der Compiler es versaut hat.
In der Regel wird die Qualität eines Compilers ja an den Optimierungen
und Libs(z.b. für Gleitkommaberechnungen) gemessen und kein Mensch
schaltet Optimierungen aus. Warum sollte man sonst so viel Kohle für
z.b. IAR EWB ausgeben wenn gcc ohne Optimierungen auch alles "richtig"
übersetzt.
Michael G. schrieb:> In C macht man sowas besser mit>> #if 0> // dead code> #endif>> In Java wuerde man sowas z.B. gar nicht schreiben koennen, da der> Compiler keinen toten Code erlaubt -- was ja auch nicht ganz sinnlos> ist.
Eben, und sinnlos ist auch das Auskommentieren von Code. Wenn er weg
soll, dann wird er gelöscht. Und da man sowieso nicht ohne eine
ordentliche Versionsverwaltung entwickelt, geht auch kein Code verloren.
Aber große Blöcke von auskommentierten Code sind schlecht für die
Qualität und Wartbarkeit des gesamten Quellcodes. Auskommentierter Code
wird nicht von Tests behandelt, wer wird nicht weiter entwickelt, er
wird bei refactorings übergangen usw.
gruß cyblord