Forum: Mikrocontroller und Digitale Elektronik Was bewirkt in C folgender Befehl


von Karlson vom Dach (Gast)


Lesenswert?

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

von c+- (Gast)


Lesenswert?

hi,

was verwirrt dich daran?

von Ben _. (burning_silicon)


Lesenswert?

Wird wohl auch niemals ausgeführt.

Sieht aus wie ein Stück sinnloser Code, mit dem man eigenen Code 
markieren kann.

von Christian F. (cmf) Benutzerseite


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von Karlson vom Dach (Gast)


Lesenswert?

Also if(0) würde tatsächlich nie ausgeführt werden ?

von Ben _. (burning_silicon)


Lesenswert?

ausprobieren...

von Karlson vom Dach (Gast)


Lesenswert?

Ups, Frage ja schon beantwortet.

Herzlichen Dank.

Das steht so in einem SPS-Programm. Ich frage mich nur warum ?

von Christian F. (cmf) Benutzerseite


Lesenswert?

Ihr habt natürlich Recht, das wird nie ausgeführt. Doof, dass man seine 
Beiträge nicht bearbeiten kann.

von Ben _. (burning_silicon)


Lesenswert?

Könnte auch sein daß es immer ausgeführt wird. Ich weiß nicht wie der 
Compiler das wertet wenn nur ein Element angegeben wird.

von lkmiller (Gast)


Lesenswert?


von Karlson vom Dach (Gast)


Lesenswert?

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.

von Christian F. (cmf) Benutzerseite


Lesenswert?

jaja. Ich weiß. Es gibt nur while Abfragen und If Schleifen...

von Heinz (Gast)


Lesenswert?

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.

von Ben j. (scarab)


Lesenswert?

könnte es sein das das kein "von Hand" geschriebener Code ist sondern 
durch irgend ein Programm oder Script generierter?

von Heinz (Gast)


Lesenswert?

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!

von Ben _. (burning_silicon)


Lesenswert?

Ich würd sowas einfügen um meinen Code zu markieren. Sieht für den 
klauenden Laien aus wie echter Code und stört kein bißchen im Programm.

von Karlson vom Dach (Gast)


Lesenswert?

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.

von Karlson vom Dach (Gast)


Lesenswert?

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.

von Flieger (Gast)


Lesenswert?

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. Dafr 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]

von DirkB (Gast)


Lesenswert?

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.

von Karlson vom Dach (Gast)


Lesenswert?

DirkB schrieb:
> Der Code wird ein Rest aus der Testphase sein.

Ja, da könntest du allerdings Recht haben. Da habe ich noch gar nicht 
dran gedacht.

von DirkB (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von marcus6100 (Gast)


Lesenswert?

if (4294967296) ist für die meisten Compiler übrigens wieder falsch ;)

von Rolf M. (rmagnus)


Lesenswert?

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.

von Stefan Z. (Gast)


Lesenswert?

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
1
if(CompilerOptimierung == 0)
2
{
3
    KonstruktInMaschinenCodeUebernehmenAberUeberspringen();
4
}
5
else
6
{
7
    KonstruktEntfernen();
8
}

Gruß

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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.

von Ben j. (scarab)


Lesenswert?

Stefan Zimmermann schrieb:
> CompilerOptimierung == 0

Stefan 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.

von Cyblord -. (cyblord)


Lesenswert?

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

von Paul H. (powl)


Lesenswert?

lkmiller schrieb:
> http://www.if-schleife.de

genial, kommt sofort bei mir in die favoriten

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.