Verstehe einige Befehel in C nicht ganz: ? ,-> ,<<

Hallo,

ich komme mit einigen Befehlen nicht ganz klar. Zum einen geht es um die „?“ - quasi Fragezeichen. Also das „?“ müsste doch irgendwas mit „ist gleich“ bedeuten. Nehmen wir mal ein kleines Beispiel:

ausgabe = (i4)?5:frowning:i!=0)?10:0;

da heißt es, wenn i größer/gleich zwei, dass er weiter geht und fragt ob i größer als 4 und wenn das auch nicht zutrifft, dann fragt er ob i ungleich 0 und wenn das stimmt dann ist ausgabe 10, falls nein, dann ausgabe 0? Habe ich das so richtig verstanden? Dann wäre das schonmal sicher ^^, habt ihr noch andere extrembeispiel bzw. wie man das noch mit ? so machen kann.

Gut jetzt weiter. Ich sehe manchmal „->“ in C, leider weiß ich nicht wirklich was das macht bzw. noch keine Erklärung dazu gefunden. Also es geht wirklich um -> und nicht um =>. Ich sehe manchmal variable->variable , aber immer zeigt der pfeil nach rechts. Kann nicht entziffern was das heißen soll. Was macht das? Geht es auch anders?

Jetzt nochwas zum

Hallo Fragewurm,

ich komme mit einigen Befehlen nicht ganz klar. Zum einen geht
es um die „?“ - quasi Fragezeichen. Also das „?“ müsste doch
irgendwas mit „ist gleich“ bedeuten. Nehmen wir mal ein
kleines Beispiel:

ausgabe = (ib) ? a : b)

Jetzt versuche dieses Macro mit if zu schreiben.

Gut jetzt weiter. Ich sehe manchmal „->“ in C, leider weiß ich
nicht wirklich was das macht bzw. noch keine Erklärung dazu
gefunden.

In C arbeitet man viel mit Zeigern und oft zeigt so ein Zeiger auch auf eine struct:

typedef struct
 {
 int a;
 int b;
 } sy;

sy \*ptr;

jetzt kann man entweder
 (\*ptr).a = 10:
oder
 ptr-\>a = 10;
schreiben.

Jetzt nochwas zum > sind Schiebe-Operationen.

Das ober bedeutet dass j zuerst um 3 Bits nach links verschoben wird und dann a zugewiesen.
>> verschiebt entsprechend nach rechts

Wie genau erklärt man die funktion von „~“. Also ich
weiß das soll negieren, allerdings nicht so was ich unter
negieren verstehe.

Es gibt das Einerkomplement und das Zweierkomplement.
a = -a;
ist das Zwierkomplement
a = ~a;
ist das Einerkomplement.

http://de.wikipedia.org/wiki/Einerkomplement
http://de.wikipedia.org/wiki/Zweierkomplement

MfG Peter(TOO)

ich komme mit einigen Befehlen nicht ganz klar. …

Hallo,

man kann eben in verschiedene Richtungen optimieren, und die Erfinder von C waren schreibfaul und haben auf kürzest mögliche Schreibweisen optimiert - daher gilt C als schwierig, zumindest ist es schwer lesbar. Manche bezeichnen C als Write Only Sprache.

Viele traditionelle C-Programmierer treiben das, aus persönlichem Ehrgeiz oder zum Spass, noch auf die Spitze, indem sie so unverständlich wie möglich formulieren. Es gibt regelrechte Wettbewerbe, wer für eine bestimmte Aufgabe den undurchsichtigsten Sourcecode zustande bringt. Man kann natürlich nicht erwarten, dass das der Softwarequalität dienlich ist, aber der Hintergedanke ist oft „wenn mein Chef versteht, was ich schreibe, könnte ich ja überflüssig werden“.

Aber das ist ein Problem einer bestimmten Spezies von Programmierern, man kann auch in C verständliche und gut dokumentierte Programme schreiben.

Gruss Reinhard

Hallo Fragewurm,

Hi Peter :smile:

In diesem Fall schon.

Der Unterschied ist aber dass ?: einen Wert liefert.

#define MAX(a,b) ((a>b) ? a : b)

Jetzt versuche dieses Macro mit if zu schreiben.

Das wäre doch:

//einlesen von a,b

if(a\>b)
 ausgabe = a;
else
 ausgabe = b;

oder irre ich mich da jetzt?

In C arbeitet man viel mit Zeigern und oft zeigt so ein Zeiger
auch auf eine struct:

typedef struct
{
int a;
int b;
} sy;

sy *ptr;

jetzt kann man entweder
(*ptr).a = 10:
oder
ptr->a = 10;
schreiben.

Aja! Ok, irgendwie kannte ich das nicht wirklich. Kenne das nur mit dem normalen Zeiger (was für mich mit * geht). Das „->“ benutzt man aber im normal fall nicht so oft oder, also nur bei struct geschichten? Ich nehme an eine Aufgabe wie „versuchen sie mit einem Pointer eine Buchstabe auf einem String zu ändern“ nicht anzuwenden:

char wort[] = "hallo";
char \*p;

p = wort;
\*p = 'M';
//ausgabe wird zu: Mallo

also das würde jetzt mit „->“ nicht gehen oder?

Dein Beispiel ist C++

du meinst wohl

a = j

Hallo Waldi,

Der Unterschied ist aber dass ?: einen Wert liefert.

#define MAX(a,b) ((a>b) ? a : b)

Jetzt versuche dieses Macro mit if zu schreiben.

Das wäre doch:

//einlesen von a,b

if(a>b)
ausgabe = a;
else
ausgabe = b;

oder irre ich mich da jetzt?

Du irrst.

Mit
#define MAX(a,b) ((a>b) ? a : b)
kann man folgendes im Programm schreiben:
a = MAX(b,c);

Da es ein Macro ist, spielt es fast keine Rolle, welchen Datentyp a und b haben. Nur ‚>‘ (Grösser als) muss für die Datentypen definiert sein.

Aja! Ok, irgendwie kannte ich das nicht wirklich. Kenne das
nur mit dem normalen Zeiger (was für mich mit * geht). Das
„->“ benutzt man aber im normal fall nicht so oft oder, also
nur bei struct geschichten?

Jo, funktioniert nur mit Structs.
Aber, vernünftige Programme schreibt man nicht ohne Structs!

Structs sind die erste Stufe der Objektorientierten Programmierung von C++. Mit einem Struct kann man zusammengehörige Daten zu einem Objekt zusammenfassen.

Ich nehme an eine Aufgabe wie
„versuchen sie mit einem Pointer eine Buchstabe auf einem
String zu ändern“ nicht anzuwenden:

char wort[] = „hallo“;
char *p;

p = wort;
*p = ‚M‘;
//ausgabe wird zu: Mallo

also das würde jetzt mit „->“ nicht gehen oder?

Nö, da kannst du mit ‚->‘ nix anfangen.

Es gibt das Einerkomplement und das Zweierkomplement.
a = -a;
ist das Zwierkomplement
a = ~a;
ist das Einerkomplement.

Tatsächlich habe ich es zuerst versucht als Einerkomplement zu
sehen, ABER ich habe immer wieder falsch umgerechnet! Deswegen
war es komisch und habs nicht verstanden :smile:

int a = 10;
printf("Wert: %d (Hex:%X) ~Wert: %d (Hex:%X)\n", a, a, ~a, ~a);

MfG Peter(TOO)

1 Like

Danke! Jetzt sitzt erstmal alles :smile:

Jo, funktioniert nur mit Structs.
Aber, vernünftige Programme schreibt man nicht ohne Structs!

Structs sind die erste Stufe der Objektorientierten
Programmierung von C++. Mit einem Struct kann man
zusammengehörige Daten zu einem Objekt zusammenfassen.

Oh nein, C++ kommt noch auf mich zu… dann sollte ich mich jetzt schnell an das coden von Struct gewöhnen.

Danke und Gruß,
Waldi