if(0) < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 07:16 So 11.07.2010 | Autor: | max_e |
hallo,
wenn ich die anweisung
int i=0; if(i=0) cout<<i++;
habe, dann gibt der compiler mir keinen wert zurück, dh. auch keine Null
an was liegt es?
ich meine es steht doch dann im if argument folgender ansatz:
if(0) cout<<i++;
wieso bearbeitet der compiler den ausgabebereich nicht, in seiner anweisung steht zwar eine null, aber es ist doch kein bool!!
danke max
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 09:05 So 11.07.2010 | Autor: | Infinit |
Hallo max,
die Programmierzeiten sind bei mir schon lange her, aber wenn ich mich nicht irre, wird mit
if (i=0)
eine Zuweisung vorgenommen, die logische Abfrage schreibt man als
if (i==0).
Könnte es daran liegen, dass der Compiler nichts rausgibt?
Viele Grüße,
Infinit
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 09:14 So 11.07.2010 | Autor: | max_e |
hallo infinit,
Ja es handelt sich um eine Zuweisung if(i=0)
Jedoch
wenn ich (habs schon probiert) schreibe
if(1)....-> läuft der Compiler in die Anweisung rein
if(0)....-> der Compiler lässt die Anweisung liegen
also unterscheidet der Compiler in der if anweisung zwischen 0 und allen anderen zahlen, kann es etwa sein das der compiler einen impliziten cast insgeheim durchführt, praktisch die integer variable in ein bool transformiert und dann die ausführung macht...??
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 09:32 So 11.07.2010 | Autor: | Infinit |
Hallo max,
so wie Du das Verhalten des Compilers beschreibst, habe ich auch das Gefühl, dass hier eine Typumwandlung durchgeführt wird.
Mehr kann ich aber jetzt auch nicht dazu sagen.
Viele Grüße,
Infinit
|
|
|
|
|
Hallo!
Die Sache ist etwas komplizierter.
Erstmal zum Begriff: Der Compiler ist eigentlich nur ein Programm, der aus deinem Quellcode ein ausführbares Programm macht, er selbst hat mit dem Laufen des Programms dann wenig zu tun.
Der Compiler ist ziemlich intelligent und interpretiert den Code schon so weit wie möglich und ersetzt a=1+2+3+4+5 direkt durch a=15, ebenso erkennt er, daß ein if(1) IMMER gültig ist, und streicht das IF und einen evtl vorhandenen, ELSE-Block, der ja eh nie aufgerufen wird. Allerdings versucht er damit nur, das Programm schneller zu machen, das ist für dich normalerweise belanglos.
Das mit dem internen Cast ist auch nicht ganz korrekt. Letztendlich überprüft ein IF, ob sein Argument "nicht 0" ist.
Ich kann nun nicht genau sagen, wie der =-Operator in C implementiert ist, da er fest eingebaut ist. Aber vielleicht hilft ein Blick in überladene Operatoren in C++ . Da kann man ja eigene Klassen definieren, und auch festlegen, was das = da bedeuten soll.
Ich will da jetzt nicht weiter einsteigen, sondern nur ganz einfach sagen, wie das anscheinend funktioniert: Das = arbeitet intern mit Referenzen, man könnte jetzt platt sagen, das sind Adressen im Arbeitsspeicher mit der Info, was für ein Datentyp dort zu finden ist.
a=b; holt sich den Wert von der Adresse, an der b liegt, schaut, wie man den Typ von b in den Typ von a umwandelt, und schreibt den so ermittelten Wert an die Adresse, an der a liegt.
a=5; ist da nicht viel anders, denn diese 5 muß ja auch irgendwo im Speicher stehen. (Na gut, der Compiler macht das was anders, aber egal.)
Und jetzt der Knackpunkt:
Dabei wird jedesmal eine Referenz auf a zurück gegeben. Denn so ist es technisch am einfachsten, sowas wie
a=b=c=d=5; zu realisieren.
Das d wird automatisch mit der Adresse versorgt, an der der Wert 5 steht, und gibt seine eigene Adresse an das c= weiter. Das kopiert sich den Inhalt der Speicheradresse von d rüber, und gibt seine Adresse an das b= weiter...
Dein IF bekommt also bei if(a=0) nicht den Wert 0, sondern eine Referenz/Speicheradresse zu a geliefert, und da a vorher deklariert wurde, existiert diese Adresse, und die ist garantiert niemals 0, und daher wird das IF garantiert immer "aktiv" sein.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:03 So 11.07.2010 | Autor: | max_e |
hallo,
erstmal vielen dank für die genau erläuterungen,
ok -->
Punkt1.)
if(i=0) cout<<i++;
cout<<i;
der Code wird so eingegeben, jedoch bekomme ich in der ausgabe nichts zurück, ich müsste doch eine 0 zurückbekommen.
hingegen wenn ich so schreib
if(i=2) cout<<i++;
cout<<i;
dann bekomme ich eine 2,
und dann eine 3
--> ok macht Sinn
------> wenn nun i mit der 0 belegt ist, dann hat die variable schließlich einen wert, wenn nun meine if-anweisung erkennt bzw. akzeptiert das i mit 0 belegt ist, muss doch die ausführung durchgeführt werden cout....
aber es passiert nichts..
danke max
|
|
|
|