PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++]2 fragen (!operator und flags)


amida maru
2007-03-25, 19:56:41
Hallo. Also ich habe 2 Fragen. Ich kapier irgendwie den Sinn von dem !(nicht) operator nicht. Könnt ihr mir den bitte erklären? und vielleicht ein kleines code snippet geben?
zweite frage wäre was flags sind. Kann mir das einer erklären?

Coda
2007-03-25, 19:59:27
Was genau kapierst du denn nicht an operator!()? Das ist halt normal ein logisches Nicht und überladen machts was du willst.

Was für Flags?

amida maru
2007-03-25, 20:17:36
Ab und zu an der eigenen Nase zupfen.

ich check denn sinn nicht. dafür gibts doch den != operator oder?

Neomi
2007-03-25, 20:19:16
Ich kapier irgendwie den Sinn von dem !(nicht) operator nicht.

Der Sinn ist ganz einfach, das Ergebnis eines Ausdrucks (nein, kein Papier aus dem Drucker) zu invertieren. Aus !true wird false, aus !false wird true, !(a == b) ist identisch zu (a != b). Bevor du fragst, == heißt "gleich" und != heißt "ungleich".

zweite frage wäre was flags sind. Kann mir das einer erklären?

In der Regel sind Flags einfach Optionen, die durch gesetzte Bits in einem Sammelregister (Flagregister) enthalten sind. Letztens hattest du ja schonmal mit Fenstern experimentiert, da sind dir welche untergekommen. Die Windowstyles (WS_...), die du per | (bitweises Oder) kombinierst, sind Flags.

Monger
2007-03-25, 20:22:32
Hm, wie erklärt man ein Flag ?!?

Ich vermute, dass der Begriff aus der Nachrichtentechnik stammt. Stell dir vor, du stehst auf einem Schiff, und willst von überall her wissen, ob die ganzen Stationen bereit sind. Zu dem Zweck vereinbarst du einfach, dass jede Station ein Fähnchen hochstellt wenn sie bereit sind, und es ansonsten unten lässt.

So ähnlich geht man mit "Flags" um: die willst entweder eine ganze Reihe von bestimmten Bedingungen prüfen, oder übergeben. Statt jetzt dutzende von einzelnen Parametern zu übergeben, übergibst du nur ein Flaggenwort, und codierst dort alle Zustände rein. Zum Beispiel:


const int stationA = 1;
const int stationB = 2;
const int stationC = 4;
const int stationD = 8;
// ...
// Station A, C und D bereit: 1+4+8 = 13

Wenn du jetzt so einen Parameter an eine Methode übergibst, rechnest du also die ganzen Parameter zu einer Zahl zusammen. In aller Regel macht man das aber intelligenter, indem man dem PC die Rechnerei überlässt:


doSth(stationA | stationC | stationD)

Da wir die ganzen Namen als Konstanten deklariert haben, geht das auch so.

Neomi
2007-03-25, 20:31:05
ich check denn sinn nicht. dafür gibts doch den != operator oder?

Wenn du schon so anfängst: wo liegt denn der Sinn von != deiner Meinung nach? Oder <=, ==, >=, >, &&?

(a != b) ist äquivalent zu ((a < b) || (b < a))
(a == b) ist äquivalent zu (!((a < b) || (b < a)))
(a <= b) ist äquivalent zu (!(b < a))
(a >= b) ist äquivalent zu (!(a < b))
(a > b) ist äquivalent zu (b < a)
(a && b) ist äquivalent zu (!(!a || !b))

Es gibt kein != ohne !, da != auf ! basiert. != ist ein Vergleichsoperator, alle Vergleichsoperatoren basieren auf < (alternativ >) und logischen Verknüpfungen. Wobei die logische Verknüpfung && durch || und ! definiert ist, alternativ kann man || durch && und ! definieren.

Gast
2007-03-25, 20:34:59
(a > b) ist äquivalent zu (b < a)


zu (b <= a)

Und in C++ muss das alles nicht mehr gelten wenn Programmierer Operatoren zweckentfremden ;)

Gast
2007-03-25, 20:35:42
Ah hab net richtig gelesen. lol

Neomi
2007-03-25, 20:39:07
zu (b <= a)

Schau nochmal genau hin. (b <= a) ist auch dann erfüllt, wenn (b == a) erfüllt ist, in dem Fall ist aber (a > b) nicht erfüllt. ;)

Und in C++ muss das alles nicht mehr gelten wenn Programmierer Operatoren zweckentfremden ;)

Klar, bin von der "normalen" Nutzung ausgegangen.

The_Invisible
2007-03-25, 20:47:28
wolltest du nicht mal ein spiel programmieren?

ich mein, wie will man ein spiel programmieren wenn man nichtmal so grundlegende operatoren kennt, das lernt man ja quasi gleich nach dem "hello world" beispiel.

also entweder nochmal von neu anfangen und alles genau durchgehen oder zuerst eine höhere "sprache" angehen, zb php welches konzepte von c und java beinhaltet

mfg

Gast
2007-03-26, 13:40:47
lieber a. m.,
ich verstehe diese Sprünge nicht! Dein letzter Post ging um das doch etwas gehobeneThema Singleton und nun gehts wieder zu den Basics.
Warum besorgst Du Dir nicht eins von den C++-Büchern, die Du in einem anderen Thread erfragt hast und arbeitest es gut durch?

Gast
2007-03-26, 20:10:48
Er hat sich schon solche bücher gekauft, aber auch den Autoren scheint er nicht zu glauben.. genausowenig wie den leuten hier im Forum. Dass er immer riesige Sprünge zwischen seinen Fragen hat(inhaltlich) liegt daran, dass er etwas in seinem Buch einfach überspringt, wenn er es nicht nach 2 Tagen kann.

MuLuNGuS
2007-03-27, 10:17:36
hier threadstarter:

C++. Lernen und professionell anwenden. von Ulla Kirch-Prinz und Peter Prinz

http://www.amazon.de/C%2B%2B-Lernen-professionell-anwenden-Kirch-Prinz/dp/3826615344/ref=sr_1_1/028-2681320-5418952?ie=UTF8&s=books&qid=1174983298&sr=1-1

spitzenbuch, wenn es damit nicht klappt is feierabend :D
®

ach ja, snippet gibbet auch noch: (reimt sich sogar ;) )

#include <iostream>
#include <conio.h>

using namespace std;

int main(int argc, char* argv[])
{

int a = 10;
int b = 20;

if(a < b)
cout << "true" << endl;
else
cout << "false" << endl;

if(!(a < b))
cout << "true" << endl;
else
cout << "false" << endl;

getch();
return 0;
}

amida maru
2007-03-27, 10:27:20
ok den !operator hab ich jetzt kapiert aber das flags noch nicht ganz....
um flags zu verknüpfen benutzt man ja den | operator ein bitoperator.
der verknüpft ja zwei zahlen.
zb:
1011
|0001
L:1011
oder?

mithrandir
2007-03-27, 10:38:12
Im Grunde schon. Und jedes einzelne Bit bezeichnet ein Flag.

Evtl. mal hier gucken:
http://www.pronix.de/pronix-676.html

Monger
2007-03-27, 12:07:51
Genau. Und jedes Flag bezeichnet genau ein Bit, deshalb muss ein Flag immer eine Potenz von 2 sein:


1 = 2^0 = 0001
2 = 2^1 = 0010
4 = 2^2 = 0100
8 = 2^3 = 1000

1 | 4 | 8 = 1101

amida maru
2007-03-27, 17:47:51
ich glaub das flag und verknüpfen lass ich mal das verwirrt mich....

TheGamer
2007-03-27, 18:39:23
ich glaub das flag und verknüpfen lass ich mal das verwirrt mich....

Siehst du und genau diese Einstellung ist fehl am Platz. Du brauchst fuer solche Dinger mehr Ausdauer, dann klappts auch.

wori
2007-03-27, 20:02:44
ich glaub das flag und verknüpfen lass ich mal das verwirrt mich....
Wenn Du programmieren willst musst Du dadurch.
Als erstes Boolesche Algebra aneignen.
Siehe hier: http://de.wikipedia.org/wiki/Boolesche_Algebra

Dann die logischen und die Bitoperatoren in C/C++ durcharbeiten.

Die Links sind von der sehr empfehlenswerten Seite c-plusplus.de
Lehrbuch
http://www.c-plusplus.de/cms/modules.php?op=modload&name=mbBooks&func=db&theme=cpp&sortby=title
oder
Tutorial
http://www.c-plusplus.de/cms/modules.php?op=modload&name=Downloads&file=index&req=viewsdownload&sid=2

Persönlich rate ich dazu ein gutes Lehrbuch zukaufen.
Ich hab mal kurz Deine anderen Threads zum Thema C++ überflogen. Auffällig ist, dass Du sehr springst in den Themen. Fang von vorne an und geh systematisch vor. Mit Deinem Stand bist Du zur Zeit sehr weit weg von der Anwendung eines Singletons. Ohne das mathematische Rüstzeug zur Aussagenlogik wird es auch nichts.
Auch ja noch eine zwingende Grundlage: Zahlensystem (dezimal, Oktal, Binär und Hexadezimal)
Der Weg ist eben etwas mühsam und kostet Zeit. Das war es für alle bisher und ich denke das wird es auch weiter sein.
Viel Spaß

amida maru
2007-03-27, 20:28:42
ok werd ich machen^^
und danke für die hilfe.

Gast
2007-03-27, 21:40:36
Ein paar Fragen für dich amida. Ist zwar eher C, aber um die Grundlagen zu verstehen IMHO ganz vernünftig. Viel Spaß


Welche(r) der folgenden Ausdrücke besitzt in C den Wahrheitswert falsch?

3 + 3
3 / 3
3 * 3
3 - 3

Welcher arithmetischen Operation entspricht die Bitverschiebung 4 << 2?

4 + 2
4 * 2
4 / 2
4 * 4
4 / 4

Wann lässt sich eine for()-Schleife durch eine while()-Schleife darstellen?

nie
immer
in bestimmten Einzelfällen
nur, wenn die Bedingung numerisch ist


Was sind die Werte der Ausdrücke *p, *p+*q und *p * *q nachdem folgende
Operationen durchgeführt werden:

int x=2, y=3;
int *p, *q;
p = &x;
q = &y;

Was gibt das folgende Code-Schnipsel aus?
char *p = "hello";
printf("%c", *++p-+-1);

Wie kann man die einzelnen Elemente eines Arrays mit 10 Elementen
ansprechen? Was geschieht, wenn man die Adresse des 11. Elementes dieses
Arrays anspricht?

Mdk
2007-03-27, 22:12:30
Da fehlt aber noch
"Schreiben Sie eine Funktion encrypt, welche einen String zurückliefert, einen
int und einen String als Argument hat. Der Rückgabewert entspricht den um
den int-Betrag verschobenen Inputstring (Cäsar-Verschlüsselung)." :-)

Ich rieche einen TUler...;-)

mfg
mdk

Chris Lux
2007-03-27, 22:15:57
ich glaub das flag und verknüpfen lass ich mal das verwirrt mich....
du hast echt keine antworten mehr verdient!

dir fehlen die einfachsten grundlagen. binäre darstellung von integerzahlen, logische operationen, deren rangfolge etc.. schau dir solche sachen erstmal an. C und auch C++ sind zwar hochsprachen, aber haben sehr maschinennahe grundlagen/möglichkeiten. man muss schon genau wissen was man da verändert, adressiert oder mit was für typen man es zu tun hat. denn ein pointer auf einen wert ist auch ein typ mit dem man böse sachen machen kann. lern erstmal was das alles ist bevor du wieder sagst du würdest es überspringen weil es dich verwirrt und dann nach komplexen sachverhälten fragst.

Ich rieche einen TUler...;-)
das hat nix mit TU (oder TU I) zu tun ;). das sind grundlegende C grundlagen... ;)

Mdk
2007-03-27, 22:19:40
[...]


das hat nix mit TU (oder TU I) zu tun ;). das sind grundlegende C grundlagen... ;)

Sei versichert, ich kenne unsere Prüfungsfragen :-)

http://www.iicm.tugraz.at/esp/klausur/2006_a/ESP%20Prüfungsbogen%20Gruppe%200.pdf

mfg
mdk

Chris Lux
2007-03-27, 22:20:34
Sei versichert, ich kenne unsere Prüfungsfragen :-)
hehe, ich meinte nur, bei uns waren sie sehr ähnlich ;)

Gast
2007-03-28, 10:37:43
Sei versichert, ich kenne unsere Prüfungsfragen :-)

http://www.iicm.tugraz.at/esp/klausur/2006_a/ESP%20Prüfungsbogen%20Gruppe%200.pdf

mfg
mdk
Stimmt schon... ;)
Sind aber gute Fragen. Recht einfach gehalten und auf Verständnis getrimmt, dürfte gerade passen für den guten a.m.

Die Prüfungen beim Klaus waren da schwerer...

das hat nix mit TU (oder TU I) zu tun . das sind grundlegende C grundlagen...

Stimmt auch. :D

Mdk
2007-03-28, 16:22:50
Stimmt schon... ;)
Sind aber gute Fragen. Recht einfach gehalten und auf Verständnis getrimmt, dürfte gerade passen für den guten a.m.


Das hab ich ja garnicht bestritten, sind durchaus angebracht. Ich würde mich ja auf selbiger Seite auch nach den Übungen umsehen, kommt ohne allzu großen Aufwand immer was ganz nettes raus.


Die Prüfungen beim Klaus waren da schwerer...



Those were the days (bin ich echt schon so alt?).

mfg
mdk

amida maru
2007-03-29, 17:11:00
aufgabe
1. ist 3-3 null und null ist false.
2.die bitoperatoren kann ich nicht so richtig
3.in bestimmten einzelfällen.
4.*p=x also 2,
*p+*q= x+y also 2+3 = 5,
*p *(mal)*q = x*y also 2*3 = 6

so ich hoffe ich hab alles richtig.

Gast
2007-03-29, 17:20:30
3.in bestimmten einzelfällen.
Zeig mal einen Fall, wo es nicht geht.

amida maru
2007-03-29, 17:36:38
ich hab keine ahnung ich hab bei drei nur geraten....

Monger
2007-03-29, 17:49:39
ich hab keine ahnung ich hab bei drei nur geraten....
Kann man imho auch ohne Informatik Vorlesungen kaum wissen.

Tatsächlich kann JEDE for Schleife durch eine passende while Schleife ersetzt werden. Die meisten Compiler wandeln sogar jede For Schleife erstmal in eine While Schleife um, bevor daraus Maschinencode erzeugt wird.

Die Frage wirkt vielleicht ein bißchen unnütz, aber sie hat einen interessanten Hintergrund: moderne Sprachen haben viel "syntaktischen Zucker", den man eigentlich genauso gut anders schreiben könnte, den man aber eingeführt hat damit die Sprache einfach handlicher wird. Moderne Sprachen sind somit mehrdeutig.

Gast
2007-03-29, 18:34:45
Kann man imho auch ohne Informatik Vorlesungen kaum wissen.
WTF?
Was machen all die armen Programmierer da draussen, die nicht studiert haben?
Wer sich dazu 5 min Gedanken macht sieht das auch so. Auch in dem Alter.

@amida maru: Raten bringt dir vielleicht was in der Schule, wenn du damit durch Glück noch Punkte einsammeln kannst. Wenn du für dich selber was lernst, bringt dir das rein garnichts.

Trap
2007-03-29, 19:02:37
Tatsächlich kann JEDE for Schleife durch eine passende while Schleife ersetzt werden.
Es können sogar alle Schleifen und Rekursionen eines Programms durch eine einzige while-Schleife ersetzt werden.

Das ist genaugenommen auch das was passiert wenn man ein Programm auf einer CPU ausführt, nur dass die while-Schleife in der CPU als Hardware implementiert ist.

Monger
2007-03-29, 19:14:25
WTF?
Was machen all die armen Programmierer da draussen, die nicht studiert haben?
Wer sich dazu 5 min Gedanken macht sieht das auch so. Auch in dem Alter.

Um zu wissen dass es in JEDEM Fall funktioniert, muss man ein Stück weit was über den Compiler und Assembler wissen. Beides sind Dinge, die ein normaler C++ Programmierer nicht wissen muss und dementsprechend auch längst nicht immer weiß. Dass ein Anfänger wie Amida Maru sowas nicht weiß, ist eigentlich klar.

Also komm von deinem hohen Ross mal wieder runter.

Chris Lux
2007-03-29, 19:45:49
Um zu wissen dass es in JEDEM Fall funktioniert, muss man ein Stück weit was über den Compiler und Assembler wissen. Beides sind Dinge, die ein normaler C++ Programmierer nicht wissen muss und dementsprechend auch längst nicht immer weiß.
wie bitte?
was hat ein konstrukt wie eine schleife auf diesem niveau mit compiler und assembler zu tun? ich kann dir das sogar in noch höherer pseude code sprache zeigen, dass das geht. da brauch ich keinen assembler dazu.

amida maru
2007-03-29, 19:51:48
lasst ma monger in ruhe. der hilft wenigstens. manche können sich hier n beispiel dran nehmen. weil manche hier nur kritisieren und zwar nur....

Coda
2007-03-29, 19:53:19
Eben

for(foo;bar;qux) { ... }

=

{
foo;
while(bar) {
...
qux;
}
}

Gast
2007-03-29, 21:15:20
lasst ma monger in ruhe. der hilft wenigstens. Ändert aber auch nix daran dass er unrecht hat.manche können sich hier n beispiel dran nehmen. weil manche hier nur kritisieren und zwar nur....
s. ein Post über mir.

Zeig mal einen Fall, wo es nicht geht.
Guter Punkt. :D
@amida: solltest du dir merken. Wenn du dir wieder mal nicht sicher bist geh so an das problem heran.

Monger
2007-03-29, 21:34:59
wie bitte?
was hat ein konstrukt wie eine schleife auf diesem niveau mit compiler und assembler zu tun? ich kann dir das sogar in noch höherer pseude code sprache zeigen, dass das geht. da brauch ich keinen assembler dazu.
Natürlich kann ich dir ein Schleifenkonstrukt nach dem anderen hinschmeißen, und du kannst an jedem so lange rumbasteln bis es passt. Aber schreib mal z.B. eine entsprechende Regel für eine For-Each Schleife in einem Compiler - so trivial ist das nämlich nicht, sowas allgemeingültig zu machen. Und das muss man machen, denn längst nicht alles was man als Mensch so intuitiv hinschludert, kann der Rechner ebenso. Menschliche Logik ist trügerisch...

DASS es tatsächlich gehen muss, sieht man spätestens auf Assembler Ebene: da löst der Compiler nämlich letztendlich alles in die selbe Struktur auf.

Chris Lux
2007-03-29, 22:18:46
DASS es tatsächlich gehen muss, sieht man spätestens auf Assembler Ebene: da löst der Compiler nämlich letztendlich alles in die selbe Struktur auf.
ähm, sorry hat du den schuss nicht gehört?

schau bitte mal was coda da gepostet hat. genau das wäre auch mein beispiel gewesen. werf uns bitte mal eine for-schleife her, die wir nicht so schnell auf diesem weg umwandeln können.

UND wo hat hier jemand geschrieben, dass es um compiler und assembler geht? die frage war ob man JEDE for-schleife in eine equivalente while-schleife umwandeln kann!

rotalever
2007-03-29, 22:19:39
Die meisten Compiler wandeln sogar jede For Schleife erstmal in eine While Schleife um, bevor daraus Maschinencode erzeugt wird.
Zu beachten wäre aber hier, dass es eigentlich nur sinnvoll ist in while-schleifen umzuwandeln, wenn man innerhalb einer for-schleife nach Programmiersprachenvorschrift die iterationsvariable ändern darf. Also z.B. wie in C:

for(i=0;i<42;i+=1) {
// blabla
i *= 2;
}

Ist dies nicht erlaubt, können for-schleifen teilweise viel besser optimiert werden als while schleifen.

Das ändert natürlich nichts daran, dass sich jede For-Schleife als while-Schleife darstellen lässt. Aber auch ich verstehe nicht, warum man dafür ausgerechnet über Compiler etc. bescheid wissen muss? Im Prinzip ist eine for Schleife nichts anderes als eine 1. Initialisierung, 2. Bedingung, 3. irgendein Operator. Dass man das auch mit while schreiben kann liegt doch nahe, oder?

Neomi
2007-03-30, 00:08:49
Aber schreib mal z.B. eine entsprechende Regel für eine For-Each Schleife in einem Compiler - so trivial ist das nämlich nicht, sowas allgemeingültig zu machen.

Es geht hier um C++ und nicht um Sprachen, die mit for each daherkommen. Und für die for-Schleifen in C++ gibt es nunmal die allgemeingültige Lösung, die Coda schon gepostet hat. Ein Studium oder auch nur eine einzige Vorlesung braucht man da nun wirklich nicht, zwei Minuten Zeit und ein wenig logisches Verständnis reichen da völlig.

Monger
2007-03-30, 08:06:01
Im Prinzip ist eine for Schleife nichts anderes als eine 1. Initialisierung, 2. Bedingung, 3. irgendein Operator. Dass man das auch mit while schreiben kann liegt doch nahe, oder?

Eine For-Schleife muss nichts von alledem haben. Die kann auch so aussehen:

for(;;){
// ...
}

Oder so:

for(;;doSth()){}

Man beachte, dass beide Schleifen keine Abbruchbedingungen haben...

Chris Lux
2007-03-30, 08:14:30
Eine For-Schleife muss nichts von alledem haben. Die kann auch so aussehen:

for(;;){
// ...
}

Oder so:

for(;;doSth()){}

Man beachte, dass beide Schleifen keine Abbruchbedingungen haben...
so what?


while(true) {
doSth();
// ...
}