Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
27.11.2000, 19:30
feigling



Ich bin gerade dabei, C++ zu lernen habe aber mal eine kleine Frage zum Half-Life Sourescode.
Dort steht ab und zu mal sowas:

for ( int i = 0; i < m_iSpriteCount; i++ )

Was bedeutet i++ ?
Ist es das gleiche wie i=i+1 ? Ist das eine Verkürzung, so dass man nicht immer die Gleichung reinschreiben muss, sondern einfach nur i++ schreiben muss ?
Wenn das stimmt könnte man dann auch schreiben :

for ( int i = 0; i < m_iSpriteCount; i=i+1 )

oder ist das was anderes?
Ich hoffe, ihr könnt mir helfen.
Danke im vorraus.

--

zum Seitenanfang zum Seitenende Profil || Suche
001
27.11.2000, 19:55
MotS



Ja das i++ bedeutet i=i+1;

--

zum Seitenanfang zum Seitenende Profil || Suche
002
27.11.2000, 20:05
Tron



dritte alternative:
i += 1;

es gibt auch:
i--;
i -= 1;
i /= 1;
i *= 1;
i << 1 (bit-shiften nach links)
i >> 1 (bit-shiften nach rechts)

hab ich was vergessen, kriz, unser ober-c++-guru?

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
003
27.11.2000, 22:25
TheTinySteini



ja, es gibt auch:
--i;
++i;

Der Unterschied ist folgender: Wenn du schreibst

a = i++;

dann wird erst a = i, und dann wird i um eins erhöht. Schreibst du aber

a = ++i;

dann wird erst i um eins erhöht und dann der neue i-Wert a zugewiesen. Das gleiche in grün mit dem --i;

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
004
27.11.2000, 22:38
Tron



stimmt, hab ich vergessen TinySteini, aber die benutz' ich eh nie {stattdessen a=(i++) } da man die vorangestellten ++ und -- operatoren nicht ueberladen kann

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
005
28.11.2000, 00:42
Kriz



Moment mal, Freunde!

Das was Tron gesagt hat, stimmt nicht! Die unären Operatoren ++ und -- in ihrer präfixen und postfixen Version lassen sich sehr wohl überladen! Und sie lassen sich als Elementüberladung schreiben (innerhalb einer Klasse) als auch außerhalb als globale Überladung (siehe z.B. << Operator von iostream.h), die allerdings spätestens in der Klasse als friend-Funktion deklariert werden muß.

Der Rest hat meinen Segen, Tron...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
006
28.11.2000, 03:31
Spider-Spax



hey kriz
wie waers wenn du dich mal ausdruecken wuerdest das C++ anfaenger dich auch verstehen koennen. ich wuerd es echt super finden wenn du das machen koenntest. ich wuerde gerne verstehen was du sagst, aber so kann ich das echt nicht.

THANX

--

Spider-Spax

zum Seitenanfang zum Seitenende Profil || Suche
007
28.11.2000, 08:02
Tron



die lassen sich auch praefix ueberladen? ich hab gelesen das ginge nicht, hab' das aber nich ausprobiert, postfix is ja:

class myInt
{
int i;
void operator ++ () { i++; }
}

ok, dummes beispiel, muesste aber stimmen...
wie sieht das praefix aus?

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
008
28.11.2000, 08:11
DMA147.ThW
Ehrenmember


Ähh...Bahnhof...? :)

Naja, ich meine i++ und ++i kenne ich auch von PHP, aber das hier ist doch eine Nummer grösser... lol...

--

Alexander Mieland (aka dma147)
APP - Another PHP Program
http://www.php-programs.de

zum Seitenanfang zum Seitenende Profil || Suche
009
28.11.2000, 12:07
Kriz



Also, hergehört:

Es kommt zuerst mal darauf an, ob man die Überladung von ++ (oder --) als Teil einer Klasse haben möchte oder ob aus bestimmten Gründen die Überladung des Operators außerhalb einer Klasse stattfinden soll. Wem der Begriff "Klasse" nichts sagt, der solle bitte sofort aufhören zu lesen und C++ Grundbegriffe lernen (kein Witz!)...

Ich habe zwar mal neulich geschrieben, daß ich zu diesem Thema jetzt kein großes Gebimmel halten möchte, aber watt mutt datt mutt:

A) Der innere Aufbau eines Operators (ist sehr wichtig für das Verständnis):

Ein Operator ist nichts anderes als ein Alias für eine Funktion bzw. Methode. Wenn man also im Quellcode z. B. folgendes implementiert:

x = y + z;

und x, y und z seien vom Datentyp INT, dann wandelt der Compiler diesen Ausdruck intern um in folgende Funktionen:

int operator+(int a,int b)
{
return (a+b);
}

...für den + Operator und eine Methode (Klassenfunktion) für den = Operator, denn ich aber nicht kenne, weil er nirgendwo beschrieben wird (er ist von Natur aus in C++ fest implementiert). Wie er für andere Datentypen überladen wird, weiß ich wohl, aber für die nativen Datentypen wie INT weiß ich es nicht, da der = Operator NUR als Klassenüberladung implementiert werden darf und von welcher Klasse aus INT überladen wurde, weiß ich echt nicht...

Na egal, der + Operator ist jedenfalls eine globale Überladung, da er nicht von einer Klasse abhängig sein muß, aber kann. So sieht die Überladung des + Operators als Klassenüberladung aus:

int Klassenname::operator+(int b)
{
return (m_klassenelement + b);
}

Wobei m_klassenelement irgendwo in der Klasse als INT deklariert sein sollte. Bei der präfixen Version ++i bzw. --i wird bei:

x = ++i;

zuerst der = Operator aufgerufen und danach erst der ++ Operator, während bei der postfixen Version i++ bzw. i--:

x = i++;

zuerst der ++ Operator aufgerufen wird und dann der = Operator, wie Tron das schon festgestellt hatte. Steht der unäre Operator allein da:

i++ oder ++i

dann wird er natürlich direkt und gleich aufgerufen und hat absolut denselben Effekt wie sein Gegenstück:

i++ verhält sich dann genauso wie ++i
i-- verhält sich dann genauso wie --i

Als Beispiel für den i++ Operator gebe ich mal seine "simpelste" globale und klassenabhängige Überladungsfunktion an:

a) global:

datentyp operator++(datentyp&i, 0)
{
return (i += 1);
}

Hinweise: Vorher muß mindestens auch für diesen Datentyp der Operator += überladen worden sein. Der Übergabeparameter i muß als Referenz (Call by reference) übergeben werden, da er direkt wieder veränderbar sein muß! Eine Übergabe per Wert (Call by value) würde keinen Effekt bringen, da man dann ja nur innerhalb der Überladungsfunktion mit einer Kopie von i arbeiten würde und nicht mit dem Original! Die dritte Variante über Zeiger (Call by pointer) wäre in diesem Zusammenhang zwar möglich, aber umständlicher wegen der Zeigerarithmetik.

b) klassenabhängig:

datentyp Klassenbezeichner::operator++(0)
{
return (m_i += 1);
}

Hinweise: Vorher muß mindestens auch für diesen Datentyp der Operator += klassenabhängig überladen worden sein. Ein Übergabeparameter (außer der Null) existiert hier nicht, da die zu verändernde Variable ein Element der besagten Klasse ist und dadurch direkt von einer Klassenmethode aufgerufen werden kann!

Es gibt noch andere, weniger simple Verfahren, den Operator i++ zu überladen, aber ich möchtze hiermit dieses kleine Intermezzo abschließen, da ich ansonsten sehr viel Forumsplatz wegnehmen würde. Bitte wartet doch alle, bis ich mein Einsteigerskript für C++ fertig habe. Wenn mir dann erlaubt wird, dieses als Tut oder sonstwas zum Download anzubieten, dann können alle sich C++ ganz easy anlernen...

Cu 2 all!

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
010
28.11.2000, 21:11
feigling



Wow ihr seid ja richtig gut und schnell.
Danke an alle !!!

--

zum Seitenanfang zum Seitenende Profil || Suche