Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
11.02.2002, 16:29
monkey



Quellcode:
c = Ausdruck1 ? Ausdruck2 : Ausdruck3

also wenn ausdruck 1 wahr ist(>0) dann bekommt c den wert von ausdruck 2, ansonsten den wert von ausdruck3.
das ist mir soweiit klar,aber ich weiss nichts damit praktisch anzufangen.

könnte mir jmd. bitte ein praktisches beispiel zur verwendung des konditionalen dreifachoperator geben?
thx

--

Neon Helium


Dieser Beitrag wurde am 11.02.2002 um 16:30 von monkey bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
11.02.2002, 16:34
mani



z.b.
Quellcode:printf("You switched debugmode %s\n\n", (debug == 1) ? "!on!" : "off");

das is ganz lustig um nicht extra ne funktion zu machen, die das checkt und den string zurückgibt...anstelle ner normalen if abfrage würd ichs nicht nehemen...zu unübersichtlich

--

zum Seitenanfang zum Seitenende Profil || Suche
002
11.02.2002, 16:40
monkey



oki dankeschön

--

Neon Helium

zum Seitenanfang zum Seitenende Profil || Suche
003
11.02.2002, 16:40
Kriz



Nun ja, ein einfaches Beispiel. Nehmen wir mal an, daß du eine Funktion hast, die einen Status abfragt, meinetwegen ob ein Bit in einer Variablen gesetzt ist oder nicht. Das kann man herkömmlich machen oder auch mit dem ?-Operator (wie er offiziell heißt):
Quellcode:// Herkömmlicher Weg via if...else in C++

bool IsBit1Set(int bitmask)
{
....if(bitmask & 1) return true;
....else return false;
}

// ?-Operator Weg in C++

bool IsBit1Set(int bitmask)
{
....return (bitmask & 1) ? true : false;
}

Zugegeben, das war ein laues Beispiel, denn optimiert schreibt man sowas:
Quellcode:// C

int IsBit1Set(int bitmask)
{
....return (bitmask & 1);
}

// C++

bool IsBit1Set(int bitmask)
{
....return static_cast<bool>(bitmask & 1);
}

bzw.

bool IsBit1Set(int bitmask)
{
....return (bool)(bitmask & 1);
}

Eigentlich ist der ?-Operator nicht nötig, er erspart nur ein wenig Schreibarbeit. Aber hier mal ein sinnvolleres Beispiel:
Quellcode:int Max(int a, int b)
{
....return (a > b) ? a : b;
}

Cu

--

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
004
11.02.2002, 17:15
monkey



oha
thx

--

Neon Helium

zum Seitenanfang zum Seitenende Profil || Suche
005
11.02.2002, 18:29
Another1



kriz, du hast echt immer langeweile oder? ;)

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
006
14.02.2002, 14:42
apfelkorn



herzlichen glückwunsch... ihr habt wahrscheinlich nicht nur eure großeltern verwirrt (die wahrscheinlich auch ein wenig englisch sprechen), sondern auch mich UND Rasmus Lerdorf

--

zum Seitenanfang zum Seitenende Profil || Suche
007
14.02.2002, 14:45
Prefect



Eine andere nützliche Verwendung ist:

printf("Name: %s\n", foo ? foo->name : "<null>");

oder so.

Ach ja, in C ist ein Ausdruck wahr, wenn er ungleich 0 ist. Im ersten Post steht, ein Ausdruck wäre wahr, wenn er größer 0 ist - letzteres ist falsch (auch negative Werte sind wahr, nur 0 ist falsch).

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
008
14.02.2002, 16:22
mani



hmm prefect ? und wo is nu der prinzipielle unterschied zu meinem beispiel ?

--

zum Seitenanfang zum Seitenende Profil || Suche
009
14.02.2002, 20:28
apfelkorn



der verwirrungsfaktor ist größer

--

zum Seitenanfang zum Seitenende Profil || Suche
010
15.02.2002, 10:04
mani



jaaah :)

--

zum Seitenanfang zum Seitenende Profil || Suche
011
15.02.2002, 15:16
apfelkorn



ich beschwöre euch: bitte lasst diese amputation einer if klausel im schrank unter 4 schlössern zu Hause... es macht den Code sehr viel unleserlicher... Ihr könnt ja auch gleich schon mit C# dann ankommen, .net-Produkte zusammen-Klicki-Buntieren und es dann als inoffizielles Erweiterungspack für alle Windows-Versionen, die exklusiv .net-Klicki-Bunti-Programme unterstützen, was direkt komplett ins Internet eingearbeitet wird und wodurch dann ein Virus produziert wird, mit dem man jeden Linux-Rechner Weltweit zusammenbrechen lässt...

p.s.: C# wurde auch nur mit C geschrieben :)

--

zum Seitenanfang zum Seitenende Profil || Suche
012
15.02.2002, 16:15
Kriz



Ich gehe mal davon aus, der ?-Operator stammt aus Tagen, wo persistenter Speicherplatz (Magnetband und -trommel ect.) knapp und sauteuer gewesen war. Schließlich erspart er gegenüber der vergleichbarsten if-Abfrage einige Bytes an Platz. Zudem wäre noch die Frage, ob der Compiler das ?-Konstrukt genauso auflöst wie eine if-Abfrage desselben Inhalts. Das kann ich jetzt leider nicht nachvollziehen, da ich keinen gescheiten Disassembler habe. Sollte der ?-Operator allerdings kompakter kompiliert werden als das vergleichbarste if-Konstrukt, dann hat er durchaus seine Berechtigung in der Mikrosteuerungstechnik, denn dort ist Speicherplatz nachwievor teuer.

--

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
013
15.02.2002, 16:42
anothergb02



apfelkorn
take that:
ichbindeinarsch ? printf("du hast einen Fettarsch. mit %i\n",random(0,5) ? random(2,40) : random(5302,20121)) : dunnschiss ? printf("Imkaarsch %s", bienen ? "mit Bienen" : "ohne Bienen") : brennend ? printf("stirb" random(1)?random(1)?random(1)?random(1)?random(1)?random(1)?random(1)?printf("focker"):printf("Hocker"):printf("locker"):printf("kni"):printf("focker"):printf("Lecker"):printf("Schmecker"):printf("Arsch")) : printf("Ich lösche dich mit meiner Güte.");

--

Being in john Malkovich
.....

zum Seitenanfang zum Seitenende Profil || Suche
014
15.02.2002, 17:21
monkey



Zitat:
Tja, sowas nennt man Verschachtelung, aber keine Angst - so eine kryptische Verschachtelung würden nur absolut wahnsinnige Programmierer ohne besonderen Grund verwenden! Also, bitte gewöhnt euch sowas nicht an. Man kann das ganze sogar noch beliebig erweitern (noch mehr Dreifachoperatoren einbinden!).

© 2001 Frank Hasenklever

--

Neon Helium

zum Seitenanfang zum Seitenende Profil || Suche
015
16.02.2002, 00:36
apfelkorn



*heul*

--

zum Seitenanfang zum Seitenende Profil || Suche
016
16.02.2002, 10:05
monkey



oh apfelkorn du armer ;)

--

Neon Helium

zum Seitenanfang zum Seitenende Profil || Suche
017
16.02.2002, 18:44
Prefect



? : kann Code leserlicher machen. Immerhin spart sie gegenüber eines if()-else-Blocks 3 Zeilen - man sieht also mehr Code auf einmal und kann den Code damit besser lesen. Ganz einfach :)

Das mit dem optimierten Kompilieren ist (war) sicher auch richtig. Bei modernen Compilers sollte es aber eigentlich keinen Unterschied geben.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
018
17.02.2002, 10:22
monkey



jo, prefect ich hab ne kleine frage, in meinem kleinem c++ buch steht, das rand() pseudozufallszahlen erzeugt, wie ist das denn gemeint?

--

Neon Helium

zum Seitenanfang zum Seitenende Profil || Suche
019
17.02.2002, 10:42
mani



naja, das Teil gibt halt Zufallszahlen aus :)
srand(time(0)); <<-- zum initialisieren, damit nicht immer die gleichen Zahlenfolgen auftreten
float moep;
moep = rand();

--

zum Seitenanfang zum Seitenende Profil || Suche
020
17.02.2002, 10:43
monkey



jojo das is mir schon klar :D
aber ich meinte wieso pseudozufallszahlen

--

Neon Helium

zum Seitenanfang zum Seitenende Profil || Suche
021
17.02.2002, 12:04
apfelkorn



weil es keine echten zufallszahlen sind...

die zufallszahlen werden vornehmlich durch den timer beeinflußt und mit einem guten zufallsgenerator wird auch noch vom ram gelesen. Wenn du also genau zur selben Zeit, mit genau dem selben Computer genau das selbe vor dem ausführen des zufallsgenerators gemacht hast, wird der zufallsgenerator dir genau die selben zahlen sagen

--

zum Seitenanfang zum Seitenende Profil || Suche
022
17.02.2002, 12:07
monkey



krieg das aber erstmal hin ;D

--

Neon Helium

zum Seitenanfang zum Seitenende Profil || Suche
023
17.02.2002, 12:25
Tron



apfelkorn, du laberst nonsens. ein pseudozufallszahlengenerator hat NICHTS mit dem timer oder dem ram zu tun. ein pseudozufallszahlengenerator heisst so, da er mit hilfe einer rechnung aus der letzten erzeugten zahl die naechste errechnet; und da man die genaue rechnung nicht kennt erscheinen die zahlen zufaellig.

einer der einfachsten aber recht effektiven pseudozufallszahlengeneratoren ist:
x = x * a + b;
wobei a und b feste zahlen sind und x die letzte, bzw. nach der zuweisung, dann die neue 'zufallszahl'.

ein pseudozufallszahlengenerator muss zunaechst mit der ersten zahl initialisiert werden, diese zahl nennt man 'seed' (saat).
fuer diese zahl wird haeufig der timer verwendet, es kann aber auch jede andere quelle benutzt werden. fuer debug zwecke ist das meisst eine konstante zahl, da der generator fuer die gleiche seed genau die SELBE zufallszahlenreihe produziert.

--

'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
024
17.02.2002, 15:17
Prefect



Den oben genannten Algorithmus kann man übrigens noch weiter verbessern, indem man nur die unteren Bits von x zurückgibt (also wenn x eine 64-Bit-Zahl ist gibt man die unteren 32 Bit zurück). Das hat zur Folge, daß der Zufallszahlengenerator intern noch einen versteckten, von außen unbekannten Zustand hat, wodurch die Zahlenfolge noch "unvorhersagbarer" wird.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche