Forum: PC-Programmierung Variablen Deklaration Logik?


von Sina A. (sinapse)


Lesenswert?

hallo,

ich hab mir immer vorgestellt, dass bei
1
int x;
2
3
int* y;

links steht um was es sich handelt und rechts der Bezeichner für eine 
Variable steht. also x ist ein integer... und y ist ein zeiger auf einen 
integer...

aber vermute ich, dass da eine andere logik dahintersteht... was ja 
sichtbar wird bei
1
int *z;
2
3
int (*foo)(int);

z ist jetzt auch ein zeiger auf einen integer... was ist jetzt aber die 
logik "dahinter", dass man das jetzt so schreibt... jetzt kann man ja 
nicht mehr sagen, dass links das was und rechts der bezeichner steht. 
bei dem funktionspointer foo kommt das vielmehr zur geltung...

nach meiner links-rechts-logik muesste es also irgendwie so heissen
1
int* z;
2
3
int (*function)(int) foo;

kann mir einer also die richtige logik "dahinter" erklaeren?

und warum muss eigentlich eine klammer um das *foo... koennte es also 
nicht auch heissen
1
int *foo (int);
2
3
*(int foo (int));

??

danke schonmal

von Sina A. (sinapse)


Lesenswert?

achso es geht natuerlich um C

von Karl H. (kbuchegg)


Lesenswert?

sina anargo schrieb:

> aber vermute ich, dass da eine andere logik dahintersteht...

Die ursprüngliche Idee war es, dass die Verwendung sich in der 
Definition wiederspiegelt.

definierst du einen

   int *x;


dann erhältst du einen int, wenn im Code (also in der Verwendung) ein *x 
auftaucht.

    i = *x;

von (prx) A. K. (prx)


Lesenswert?

Mein Ansatz: Nicht von links nach rechts, sondern ausgehend vom Namen 
der Variablen von innen nach aussen, unter der Berücksichtigung der 
Vorrangstufen. Also bei
  int (*foo)(int);
wird daraus
  foo         Name
ist
  *...        Pointer
auf
  (...)(int)  Funktion
returning
  int ...

von Karl H. (kbuchegg)


Lesenswert?

sina anargo schrieb:

> int (*foo)(int);

Das ist ein Pointer auf eine Funktion

> und warum muss eigentlich eine klammer um das *foo... koennte es also
> nicht auch heissen
>
> int *foo (int);

Das wäre eine Funktion die einen int* zurückliefert.

>
> *(int foo (int));

Das ist ein Syntax-Error

von Sina A. (sinapse)


Lesenswert?

Ahhhh... jetzt geht alles auf xD

dankeschoen

von troll (Gast)


Lesenswert?

Gab es in der Bibel nicht ein Programm das komplexe Deklarationen in 
menschenlesbaren Text verwandelt?

von Karl H. (kbuchegg)


Lesenswert?

troll schrieb:
> Gab es in der Bibel nicht ein Programm das komplexe Deklarationen in
> menschenlesbaren Text verwandelt?

In der Bibel nicht.

Aber mit den Stichworten
"C left right rule"
sollte man bei Google fündig werden.

Das Programm heißt traditionell 'cdecl'

von troll (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> troll schrieb:
>> Gab es in der Bibel nicht ein Programm das komplexe Deklarationen in
>> menschenlesbaren Text verwandelt?
>
> In der Bibel nicht.
Jetzt hab ich das Dingen aus dem Regal geholt und mein Gedächnis hat 
mich nicht getäuscht: Seite 123ff 5.12 Complicated Declarations

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.