Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
08.07.2002, 09:58
ludi



hi leute!

ich habe ein problem mit dem if-befehl in c.
if(a==1 && b==2 && c==64 && d==255)
{
//blablabla
}
ok, so siehts beispielsweise aus, aber wie schaffe ich es, dass if auch 'durchschaltet', wenn nur 3 wahr sind? da müsste ich ja so was hier bringen:
if((a==1 && b==2 && c==64) || (a==1 && b==2 && d==255) || (a==1 && c==64 && d==255) || (b==2 && c==64 && d==255))
{
//blablabla
}

das kanns doch nicht sein, oder? das muss auch einfacher gehen. vielleicht wisst ihr ja was...

--

diese nachricht besteht aus 100% reseiclelebaren eläktronen und 0% rächdschreibfelern ;)
[ich weiß nur, dass ich nichts weiß][!!!!!!!!!gebt TCPA keine Change!!!!!!!!!]
--==check out my new homepage==--

mfg ludi[-][i]

zum Seitenanfang zum Seitenende Profil || Suche
001
08.07.2002, 10:13
Tron



doch, das isses
aber man kann ein bisschen schummeln...

! vorsicht, hack, da schlecht lesbar; aber 100% ANSI-C++ konform !

if ((int(a == 1) + int(b == 2) + int(c == 64) + int(d == 255)) >= 3) {}

das funktioniert, da garantiert ist, dass das ergebnis von boolschen operationen 1 fuer wahr und 0 fuer falsch ist.
die expliziten casts auf int sind notwendig, da bool nur 0 und 1 speichern kann (auch wenn es in den meisten implementierungen 8bit breit ist)

<neugierde>was gibt das, wenn's fertig ist?</neugierde>

--

'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
002
08.07.2002, 12:42
apfelkorn



lol, tron is am rumhacken was das zeug hält, aber einfach so eine bool in ein int umzuwandeln, das is schon herb... Ich glaub msvc++ gibt da auch ne warning aus.

--

zum Seitenanfang zum Seitenende Profil || Suche
003
08.07.2002, 12:44
WareWolf



für mich (als nicht c++ Progger) ist aber Tron´s Variante leichter zu lesen als das "Original"
..weil ich seh auf einen Blick, er will nur 3 "Richtige", welche ist egal. Beim Original muss ich ja denken oder mitschreiben, was beides nicht so mein Fall ist =)

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW


Dieser Beitrag wurde am 08.07.2002 um 12:47 von WareWolf bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
08.07.2002, 12:54
Tron



Zitat:
apfelkorn postete
lol, tron is am rumhacken was das zeug hält, aber einfach so eine bool in ein int umzuwandeln, das is schon herb... Ich glaub msvc++ gibt da auch ne warning aus.

herb? das ist absolut legal!
ich reinterpret_caste ja keine pointer oder so ein schmu
das ist ein ganz normaler cast auf einen garantiert mindestens genau so grosen datentyp (char == bool und char <= int)

msvc++ darf da keine warnung ausgeben, das duerfte hoechstens fuer casts z.b. von long auf char ne warnung geben.

btw: die form des orginals nennt man uebrigens disjunktive normalform

--

'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
08.07.2002, 14:29
apfelkorn



oha, lernt man wieder was...

--

zum Seitenanfang zum Seitenende Profil || Suche
006
08.07.2002, 20:00
ludi



@tron: thx, is ne echt intellegente lösung :)

<neugierdebefriedugung>ich will meine c/cpp-kenntnisse mal etwas vertiefen, deshalb programmiere ich gerade ein kleines spiel, bei dem man gegen den pc "4 gewinnt" spielen kann. die anweisung nach der ich gefragt habe brauche ich, damit der pc weiß, dass er aufpassen muss, wenn der gegner nur noch eins zur vervollständigung der 4er-reihe braucht.</neugierdebefriedugung>

--

diese nachricht besteht aus 100% reseiclelebaren eläktronen und 0% rächdschreibfelern ;)
[ich weiß nur, dass ich nichts weiß][!!!!!!!!!gebt TCPA keine Change!!!!!!!!!]
--==check out my new homepage==--

mfg ludi[-][i]

zum Seitenanfang zum Seitenende Profil || Suche
007
09.07.2002, 23:12
Leviathan



eine kleine frage: seit wann kann man casts ohne klammern setzen? ich hätte das auf jeden fall so geschrieben:

Quellcode:
if (((int)(a == 1)+(int)(b == 2)+(int)(c == 64)+(int)(d == 255))>=3)
{
    //hier steht code
}

:edit:

zu legal: soweit ich weiss ist der ergebnistyp vom == -operator (zumindest bei elementardatentypen, operatorüberladungen lassen wir einmal aussen vor) schon automatisch int, so dass man eigentlich gar keine casts bräuchte (oder ist das jetzt noch ansi-c und nicht iso-c++ ?).

--

Entities: HL | HL²
Kompilierfehler
r_speeds | mehr über r_speeds


Dieser Beitrag wurde am 09.07.2002 um 23:14 von Leviathan bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
10.07.2002, 09:02
Tron



Zitat:
Leviathan postete
eine kleine frage: seit wann kann man casts ohne klammern setzen? ich hätte das auf jeden fall so geschrieben:

Quellcode:
if (((int)(a == 1)+(int)(b == 2)+(int)(c == 64)+(int)(d == 255))>=3)
{
    //hier steht code
}

das sind c++ casts, sehen aus wie konstruktor-aufrufe, also statt klassisch (int)blablubb sehen dann casts so aus: int(blablubb)
genau wie beim casten zwischen objekten (== konstruieren von temporaeren objekten)
Quellcode:class a {};

class b
{
  public:
    bClass(aClass);
};

void f(bClass);

a A;
f(b(A)); // ok, das wuerde der compiler auch implizit casten
f((b)A); // genauso sind klassische c-casts erlaubt

diese zusaetzliche schreibweise wurden zu den nativen datentypen hinzugefuegt, um sie klassen syntaktisch anzugleichen, das wird vor allem fuer generische (template) programmierung gebraucht:
Quellcode:template<class T, class U> T g(U parameter)
{
  return T(U); // ok, dummes beispiel, aber das prinzip ist klar
}

// jetzt geht sowohl das
g<b>(A);
// als auch
double D;
g<int>(D);

Zitat:
zu legal: soweit ich weiss ist der ergebnistyp vom == -operator (zumindest bei elementardatentypen, operatorüberladungen lassen wir einmal aussen vor) schon automatisch int, so dass man eigentlich gar keine casts bräuchte (oder ist das jetzt noch ansi-c und nicht iso-c++ ?).

in c++ ist das ergebnis von ==, != usw. nicht int sondern bool.
bool kann per definition nur true (1) und false (0) enthalten.
es kann aber sein, dass bei bool + bool das ergebnis automatisch auf int gecastet wird, aber darauf wollte ich mich nicht verlassen (lieber ein cast zuviel, dann weiss man wenigstens genau was los ist)
ich denke, das ist auch bei C89 so (aber keine garantie darauf)

<edit>die liebe rechtschreibung...</edit>

<edit2>hab's grade mit MinGW getestet, die signatur ist wohl
int operator + (bool, bool)
ich weiss allerdings net, ob das ne eigenart von MinGW ist oder standardkonform ist
</edit2>

--

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

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


Dieser Beitrag wurde am 10.07.2002 um 09:22 von Tron bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
009
10.07.2002, 15:57
Kriz



(int) a oder int (a) ist egal, beides sind legale Casts.

--

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
10.07.2002, 22:31
Leviathan



@tron: wenn du mit c89 den ansi-c standart meinst, da gibt es den datentyp bool einfach gar nicht. afaik war das da immer int, aber bool ist erst mit c++ eingeführt worden und hat in den ansi-c standart keinen einzug gehalten (das ist einer der sachen, die an c häufig kritisiert wurden).

und gecastet hab ich immer so: (int)(a), durch die klammern hat man das problem mit dem operatorvorrang nicht, ich hab nämlich keine ahnung, welche operatorwertigkeit ein cast hat.

und werden casts in c++-klassen nicht über eine operator-funktion definiert? ich glaube das mit den operator-funktionen muss ich mir nochmal genauer durchlesen.

--

Entities: HL | HL²
Kompilierfehler
r_speeds | mehr über r_speeds

zum Seitenanfang zum Seitenende Profil || Suche
011
11.07.2002, 00:05
Tron



ne, c89 is net der urspruengliche c standard, vielleicht kam bool aber auch erst mit c99, denke aber dass es drin ist, bin mir aber wie gesagt net sicher.

casts in c sind doch einfach nur (int)a, das 2te klammerpaar ist unnoetig.

casten auf eine andere klasse ist einfach ein konstruktor dieser klasse, der ein objekt der anderen als parameter nimmt (am besten als referenz wegen overhead)

--

'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
012
14.07.2002, 12:56
[RMen]OneStone



Die zweite Klammer ist im obigen Beispiel nicht überflüssig, da ein cast ne höhere priorität als ein == Operator hat.

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
013
14.07.2002, 12:56
[RMen]OneStone



Die zweite Klammer ist im obigen Beispiel nicht überflüssig, da ein cast ne höhere priorität als ein == Operator hat.

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
014
14.07.2002, 13:57
Tron



Zitat:
[RMen]OneStone postete
Die zweite Klammer ist im obigen Beispiel nicht überflüssig, da ein cast ne höhere priorität als ein == Operator hat.

ach nein, wirklich?
levi sagte aber (int)(a) und da ist das zweite klammerpaar ueberfluessig

--

'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
015
14.07.2002, 14:19
[RMen]OneStone



1. Sorry for doublepost
2. Warum seid ihr alle so aggressiv? Ich hab doch nur was hinzugefügt.
Das sollte überhaupt keinne Verbesserung sein, sonst hätt ich ein "Nein, " vorangestellt.

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche