Simple Frage zu Klassen

  • Original von chartus
    nein aber ernsthaft ich persönlich mag derartige variablen definitionen per kommataliste mal so rein garnicht - schon allein weil sie das sinnvolle init verhindern...

    Quellcode

    1. int* a=0, b=5;
    Wäre jetzt ein Beispiel, was allerdings erst ab ISO C 99 funktioniert. Früher in d.h. ISO C 90 mußte man ja immer erst alle Variablen definieren und konnte sie erst anschließen initialisieren. Daher sind solche Konstrukte wie ich sie vorher angeführt habe, in reinem C Programmen durchaus häufig zu finden.

    ansonsten wie - Alex schon schrieb - ist imho der spezielle Fall garnicht definiert...

    Die ISO Norm für C definiert diesen Fall sehr wohl, daher ist der Ausdruck legal. Ich kann mir nicht vorstellen, daß das in Objective-C nicht der Fall ist, auch wenn Apple meines Wissens versäumt exakt zu sagen auf welcher C Version Objective-C aufsetzt und eine formale Definition von Objective-C nicht liefert. Mir wäre es ganz Recht, wenn es eine formale Definition der Sprache Objective-C gäbe.

    Die eigentliche Triebkraft des Beispiels war es, daß ich persönlich mit Modula-II programmieren lernte. Da gehörte das "ist Zeiger" immer zum Typ und nicht zur Variable. In C ist das nicht der Fall, jedenfalls wenn man den Kommaoperator benutzt. Es ist aber der Fall wenn man ein typedef benutzt. Deshalb sollte man in allen auf C basierenden Sprachen immer Vorsicht walten lassen.
  • Original von gritsch
    wenn das das selbe wäre wie int *a; int *b, dann wäre ja auch "define intP int *" das selbe wie "typedef int * intP"... oder?

    Korrekt, wobei gerade dieses Beispiel zeigt, daß man den Präprozessor besser nicht benutzt. Leider gibt es in Objective-C kein Analogon zu C++ Templates, so daß man auf Makros nicht verzichten kann. Makros sind aber immer wieder für negative Überraschungen gut. Also, Vorsicht ist die Mutter der Porzellankiste und aller C-Programmierer.
  • Original von MCDan
    Eigentlich sind beide Schreibweisen korrekt, wobei ich persönlich int *name bevorzuge, aber dies ist halt Geschmackssache.


    Was hat das mit Geschmack zu tun? Statt von Geschmack sollte man einem Einsteiger wohl lieber was von der Bindungsstärke der Operatoren erzählen. char* a,b ist nun mal was anderes als char *a, b.
  • Original von bootie
    Beide sind Pointer auf eine Integer-Variable.


    Nö. * bindet stärker als ,. Daher hast Du nur einen Pointer auf int und einen normalen int. FF: Forsicht Falle!
  • Original von tjp
    Original von chartus
    ansonsten wie - Alex schon schrieb - ist imho der spezielle Fall garnicht definiert...

    Die ISO Norm für C definiert diesen Fall sehr wohl, daher ist der Ausdruck legal.


    Nur der Vollständigkeit halber: Ich war mir nur nicht sicher, ob dieser Fall in allen C Spezifikationen eindeutig geregelt ist, oder ob irgendeine Spec auch die Interpretation als "int * a, int * b" zuliesse. Legal (auch wenn nicht eindeutig) müsste der Ausdruck aber doch überall sein, oder übersehe ich da etwas?

    Original von tjpIch kann mir nicht vorstellen, daß das in Objective-C nicht der Fall ist, auch wenn Apple meines Wissens versäumt exakt zu sagen auf welcher C Version Objective-C aufsetzt und eine formale Definition von Objective-C nicht liefert.


    Eine formale Definition von Objective-C habe ich auch noch nicht gesehen. Aber ich bin mir nicht sicher, ob Apple sagen muss, auf welcher C Version Objective-C beruht:
    ObjC ist ja einfach eine syntaktische Erweiterung, die ich auf einer beliebigen Spec aufsetzen kann. Jedenfalls stellt sich mir dass so dar.

    Aber das kommt alles schon relativ weit vom Thema ab ...

    Alex
    The only thing that really worried me was the ether.
  • Original von below
    Legal (auch wenn nicht eindeutig) müsste der Ausdruck aber doch überall sein, oder übersehe ich da etwas?

    Für K&R C lege ich meine Hand nicht ins Feuer, aber ISO C90 und C99 interpretieren, das so wie ich es angeführt habe.
    Eine formale Definition von Objective-C habe ich auch noch nicht gesehen. Aber ich bin mir nicht sicher, ob Apple sagen muss, auf welcher C Version Objective-C beruht:
    ObjC ist ja einfach eine syntaktische Erweiterung, die ich auf einer beliebigen Spec aufsetzen kann. Jedenfalls stellt sich mir dass so dar.

    Apple ist vollkommen frei wie sie mit Objective-C verfahren. Allerdings habe ich oft genug erlebt, daß es Probleme beim Programmieren mit C bzw. C++ gab die man durch einen Blick in die jeweilige ISO Norm lösen konnte. Ich würde es daher begrüßen, wenn Apple genau definieren würde, welche C Revision sind als Basis benutzen. Zur Zeit kann man nur mutmaßen, das ist meines erachtens suboptimal.
  • Original von tjp
    [Apple ist vollkommen frei wie sie mit Objective-C verfahren. Allerdings habe ich oft genug erlebt, daß es Probleme beim Programmieren mit C bzw. C++ gab die man durch einen Blick in die jeweilige ISO Norm lösen konnte. Ich würde es daher begrüßen, wenn Apple genau definieren würde, welche C Revision sind als Basis benutzen. Zur Zeit kann man nur mutmaßen, das ist meines erachtens suboptimal.


    Vollkommen richtig. Aber, wenn ich das so ganz naiv angehen darf, ich kann gcc die C Spec ja mitgeben (also z.B. ISO 90 oder ISO 99). Die syntaktischen Elemente von Objective-C sind davon - soweit ich das sehe - vollkommen unabhängig.
    Das würde bedeuten, dass der Entwickler selbst die C Basis für Objektive C wählen kann.

    Gruss

    Alex
    The only thing that really worried me was the ether.
  • Hehehehe, die Sternchen-Platzierung mal wieder. Eigentlich schn durchdiskutiert, daher nur meine Meinung dazu.

    a) In der Tat kann man als Problem der Bindungsstärke sehen, wie es Klaus tut. Aber es geht hier ja mehr um das menschliche Verständnis. Meine Konsequenz daraus übrigens: Ich definiere niemals zwei Variablen mit nur einer Typangabe wie in "int a, b;". Das heißt bei mir stets: "inta;int b;" (Natürlich in zwei Zeilen.) Das mache ich übrigens auch, um nichts hinten zu übersehen.

    b) Die "Bedeutung" ist in C schlicht unterschiedlich. in Variablendeklarationen sieht es so aus, als ob * zum Namen gehören würde, in formalen Paramtern, als ob es zum Typen gehören würde. Da ist C einfach uneinheitlich. (*HUCH*) Ich verstehe es als Typ und schreibe daher "int* a;" statt "int *a;".

    c) Das ganze ist Geschmächle. Für den Compiler macht es keinen Unterschied, wo man das Leerzeichen hinsetzt. Also ist es wirklich Geschmäckle. Wenn man allerdings es als Typen ansieht, versteht man es leichter. Umgekehrt versteht man jedoch eine Zuweisung leichter:

    Quellcode

    1. int *a;
    2. // daraus folgt
    3. *a = 5; // Wir hatten ja gesagt, dass *a ein Int ist
    4. int* b;
    5. // Jetzt muss man genau genommen einen Moment nachdenken.
    6. *b = 5; // Wenn b ein int* ist, dann muss *b ein int sein.


    Aber es gibt wirklich Wichtigeres.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von below
    Original von klausel
    char* a,b ist nun mal was anderes als char *a, b.


    Das verstehe ich nicht.

    Alex


    Ich bei genauem Hinlesen auch nicht mehr. Ich meinte natürlich

    (1) char* a, b

    ist was anderes als

    (2) char *a, *b.

    (1) entspricht:

    char *a;
    char b;

    (2) entspricht

    char *a;
    char *b;
  • Original von tjp
    auch wenn Apple meines Wissens versäumt exakt zu sagen auf welcher C Version Objective-C aufsetzt


    Wenn Du eine Seite kennst, die ein paar Nette Beispiele zum Unterschied zwischen den Verschiedenen C Normen hat (oder selbst ein paar aufschreiben magst), dann teste ich gerne mal meine These, dass Objective-C vollkommen orthogonal zum C Standard ist.

    Gruss

    Alex
    The only thing that really worried me was the ether.
  • Naja, wann wurde Objective-C entworfen und wieviele C Normen gab es in der Zwischenzeit? Ich werde das mal nachschauen. Es gab da eine Webseite auf deutsch, die die Unterschiede zwischen C90 und C99 weitestgehend dokumentierte. Auf die Schnelle fällt mir nur BOOL vs. _Bool ein, aber da gibt es sicherlich noch anderes.
  • Original von tjp
    Naja, wann wurde Objective-C entworfen und wieviele C Normen gab es in der Zwischenzeit? .

    Ganz richtig. Aber wie ich schon sagte, ich kann mir vorstellen (und Tom ist da überzeugt), dass Objective-C unabhängig von diesen Veränderungen ist.

    Original von tjp
    Ich werde das mal nachschauen. Es gab da eine Webseite auf deutsch, die die Unterschiede zwischen C90 und C99 weitestgehend dokumentierte.


    Danke, dann finden wir das mal heraus.

    Original von tjp
    Auf die Schnelle fällt mir nur BOOL vs. _Bool ein, aber da gibt es sicherlich noch anderes.


    Ich glaube Variablendeklaration nach K&R ist schon mit ANSI C rausgeflogen, aber ich mehr fällt mir auch nicht ein.

    Alex
    The only thing that really worried me was the ether.
  • Die genannten Normen zumindest teilweise jünger als Objective-C. Der Punkt ist ja, dass die Sprache keine Rolle spielt. Du kannst auch einen Objective-Basic-Compiler schreiben.

    OOP und prozeduraler Teil sind völlig getrennt. Okay, ein falsches @ im Sprachschatz der Ausgangssprache kann zu Problemen führen. Aber ewnn du dir die Sprachdefinition von Objecitve-* anschaust, bemerkst du, dass es keinen Hinweis auf C gibt. Objective-C verheiratet dann Objective-* mit C, wobei es Sprachmittel mitbenutzt:

    "The Objective-C extensions introduce some new symbols (such as class interface), but also make use of symbols (such as function definition) that are explained in the standard C grammar. The symbols mentioned but not explained here are listed below:"

    Diese müssen in der "Zielsprache" von Objective-* vorliegen, irgendwie und völlig unabhängig. Man könnte also etwa auch die Sprachelemente von Basic oder Fortran oder was auch immer nutzen. Das interessiert Objective-* nicht.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Naja, entworfen ist gut.
    Brad Cox hat sich seit 1982 etwa mit Smalltalk beschäftigt, 1986 sein Buch veröffentlicht. An sich dürfte damit Objective-C etwa nicht ganz so alt sein wie C++.
    Der Rest ist dann bekannt: 1988 hat NeXT Objective-C lizensiert, und 1995 die dann Rechte gekauft
    I would be embarrassed if they did not spy on me.
  • Ah, eine Übersicht ist hier:

    rz.rwth-aachen.de/mata/downloa…Kotljarenko-%20Skript.pdf

    Man kann viele einfach Dinge ( // Kommentare, Variablendeklaration im for Statement etc. ) sehr schnell mit ein bischen Objective-C Code ausprobieren und dabei die Sprachversion von gcc umstellen.

    Ich würde sagen, die Resultate bestätigen, dass Objective-C vollkommne unabhängig von der C Norm ist, denn ich kann sie frei wählen (mit den entsprechenden Möglichkeiten bzw. Einschränkungen)

    Das fängt mit
    @implementation myObject
    // Das ist mein Objekt

    an. Wenn als C Standard nicht C99 oder GNUC99 (default) eingestellt ist, dann gibt das einen Fehler.

    Gruss

    Alex
    The only thing that really worried me was the ether.
  • Na ja, ein "müsste" ist etwas anderes als gefestigte Übrzeugung. Aber ich würde mal 99 % sagen.

    Eine davon unabhängigge Frage ist freilich, ob der konkete Compiler das unterstützt. gcc scheint da ja begrenzt zu sein. Mir ist das letztens übrigens irgendwo aufgefallen. Ich glaube es war so, dass der Compiler nich verwendete Parameter anmahnte, was bei Objective-C/Cocoa natürlich reichlich irritierend ist.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?