Ansi C Operator überladen?



  • c.rackwitz schrieb:

    atomkraft ist auch maechtig.

    überladene operatoren aber nicht :p

    btw: ich hätte nichts degegen, wenn selbstdefinierte operatoren im code als solche erkennbar wären. beispiel:

    a = b + c;   // addition oder nicht?
    a = b [+] c; // nicht zu verwechseln mit +
    


  • pale dog schrieb:

    rüdiger schrieb:

    Operator Überladung macht in jeder Sprache Sinn, in der es Operatoren gibt. Weil a+b ist eben leserlicher als a.some_strange_add_method(b) .

    es gibt den '+' operator schon, er tut genau das, was man von ihm erwartet: addieren.
    es besteht keine notwendigkeit, die bedeutung von '+' zu verändern, genau so wie es keinen sinn machen würde, die bedeutung von beliebigen schlüsselwörtern einer sprache zu überladen.
    🙂

    nenene du hast's nicht so ganz gerafft. in C++ gibts für eigene datenstrukturen (klassen) nämlich noch keinen überladenen '+' operator. woher soll man denn wissen was genau (also welche member) addiert werden sollen?? sowas MUSST du dir schon selbst schreiben.



  • ... schrieb:

    in C++ gibts für eigene datenstrukturen (klassen) nämlich noch keinen überladenen '+' operator. woher soll man denn wissen was genau (also welche member) addiert werden sollen?? sowas MUSST du dir schon selbst schreiben.

    das ist mir klar 😉
    genauso kann ich mir in C aus #defines einen eigenen BASIC-dialekt basteln. aber wozu 😕
    op-overloading ist bestenfalls gut für leute die dabei: http://www.ioccc.org/ mitmachen wollen 😃

    Goals of the Contest
    * To write the most Obscure/Obfuscated C program under the rules below.
    * To show the importance of programming style, in an ironic way.
    * To stress C compilers with unusual code.
    * To illustrate some of the subtleties of the C language.
    * To provide a safe forum for poor C code. 🙂



  • pale dog schrieb:

    genauso kann ich mir in C aus #defines einen eigenen BASIC-dialekt basteln. aber wozu 😕

    Nicht alles, dessen Zweck du nicht einsiehst (oder nicht einsehen willst), ist schlecht.

    op-overloading ist bestenfalls gut für leute die dabei: http://www.ioccc.org/ mitmachen wollen 😃

    Könntest du deine eigenartigen persönlichen Ansichten bitte in Zukunft etwas deutlicher als solche kennzeichnen?

    Oder willst du nur Troll des Monats werden?



  • MFK schrieb:

    pale dog schrieb:

    genauso kann ich mir in C aus #defines einen eigenen BASIC-dialekt basteln. aber wozu 😕

    Nicht alles, dessen Zweck du nicht einsiehst (oder nicht einsehen willst), ist schlecht.

    wenn du mal ein paar postings zurückblätterst, kannst du meinen vorschlag sehen, wie selbstdefinierte operatoren aussehen könnten...

    MFK schrieb:

    op-overloading ist bestenfalls gut für leute die dabei: http://www.ioccc.org/ mitmachen wollen 😃

    Könntest du deine eigenartigen persönlichen Ansichten bitte in Zukunft etwas deutlicher als solche kennzeichnen?

    was war daran undeutlich? 😕



  • Warum sollte es einen syntaktischen Unterschied geben, wenn ich zwei Integer addiere oder zwei Bignums? Das ist Schwachsinn in einer Objektorientierten Programmiersprache. Also entweder keine Operatoren oder überladbare Operatoren. Alles andere wirkt dirty zusammen gebastelt.

    Ganz zu schweigen von den Problemen bei generischer Programmierung.

    Aber du bist ja eh nicht an einer seriösen Diskussion interessiert, mein lieber vista :p



  • Kurze Zusammenfassung:
    * in C gibts keine Überladung
    * in Java gibts Überladung nur bei Methoden
    * in C++ kann man fast alles überladen
    * in Eiffel gibts Operatorüberladung, aber keine Methodenüberladung
    * in SML kann man gar nichts überladen, dafür aber beliebige eigene Operatoren definieren
    Offensichtlich widersprechen sich diese Ansätze vollkommen, aber jeder hat eine gute Begründung für seins. Wenn man sich dem Thema nähern will, sollte man diese Begründungen studieren.



  • rüdiger schrieb:

    Warum sollte es einen syntaktischen Unterschied geben, wenn ich zwei Integer addiere oder zwei Bignums?

    ja, aber da hast du wirklich die einzig sinnvolle anwendung hervorgekramt 😉
    doch wie sieht's in der realität aus? op-überladung (+) wird z.b. genommen, um strings zusammenzufügen (wobei das ist noch nicht mal des schlechteste beispiel).
    aber echt übel: denk doch mal an C++ iostreams, wie da die shift-operatorn missbraucht werden.
    *das* ist richtig mies!



  • erlaeutere uns doch bitte deinen masterplan. was willst du mit der dickkoepfigkeit bezwecken?



  • Hat ja nichts mehr mit C zu tun hier...



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • c.rackwitz schrieb:

    erlaeutere uns doch bitte deinen masterplan. was willst du mit der dickkoepfigkeit bezwecken?

    ich versuche einfach nur zu erklären, warum ich op-überladung für überflüssig halte:
    der nutzen ist klein.
    die möglichkeit schwer lesbaren code zu schreiben ist riesengross.
    aber wie schon gesagt: gegen selbst definierte ops, sofern sie sich im quelltext von eingebauten ops unterscheiden, habe ich nichts einzuwänden...
    🙂



  • pale dog schrieb:

    rüdiger schrieb:

    Warum sollte es einen syntaktischen Unterschied geben, wenn ich zwei Integer addiere oder zwei Bignums?

    ja, aber da hast du wirklich die einzig sinnvolle anwendung hervorgekramt 😉
    doch wie sieht's in der realität aus? op-überladung (+) wird z.b. genommen, um strings zusammenzufügen (wobei das ist noch nicht mal des schlechteste beispiel).
    aber echt übel: denk doch mal an C++ iostreams, wie da die shift-operatorn missbraucht werden.
    *das* ist richtig mies!

    Das Einzige? o_0

    * Klassen fuer reelle Zahlen
    * Klassen fuer Vektoren
    * Klassen fuer Matrizen
    ....

    Und das waren jetzt nur die offensichtlichen Faelle. Warum verbieten wir nicht gleich Pointer, damit kann man ja echt richtig fiese Dinge tun. Oder verbieten, dass es mehr als eine return-Anweisung pro Funktion gibt... Oder noch besser, lass die Leute doch gleich mit Lego spielen, das ist wesentlich ungefaehrlicher o_0

    Nur weil irgendwer ein Konzept schlecht verwendet kannst du's doch nicht gleich verurteilen. Oder findest du Demokratie scheisse, nur weil in Italien mal Silvio Berlusconi gewaehlt wurde?



  • Blue-Tiger schrieb:

    Das Einzige? o_0

    * Klassen fuer reelle Zahlen
    * Klassen fuer Vektoren
    * Klassen fuer Matrizen

    wenn man z.b. eine vektoraddition auf papier schreibt, sieht man ja am pfeil über dem vektor oder an den klammern, dass das + eine vektoraddition ist. in einem quelltext sieht man aber 'a = b + c;' und das sieht aus wie die addition zweier primitiver datentypen. auch hier wäre es nicht weiter schlimm, da man ja 'VectorA = VectorB + VectorC;' schreiben könnte, also kein eindeutiger missbrauch von op-überladung (aber nur wenn man aussagekräftige bezeichner wählt).
    🙂



  • pale dog schrieb:

    ...es ist nur 'syntaktischer zucker', also nichts, was man beim programmieren wirklich vermissen würde.
    🙂

    Nicht ganz ! Durch die "Überladbarkeit" von Operatoren können "primitive Typen" gleich behandelt werden wie Klassen (Ausnahme: Man kann von ihnen nicht ableiten).
    Übrigens: Die freie Wahl der Funktionsnamen führt mindestens zu ebensoviel Verwirrung.

    class A {
       int i;
    public:
       int get() { i = 7; return 5; }
       void set(int a) { outFile << a; }
    };
    

    (oder für ein etwas tiefsinnigeres Beispiel: Schau Dir mal die Bedeutungen von size(), lenght(), empty(), clear() in der STL an)

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Übrigens: Die freie Wahl der Funktionsnamen führt mindestens zu ebensoviel Verwirrung.

    class A {
       int i;
    public:
       int get() { i = 7; return 5; }
       void set(int a) { outFile << a; }
    };
    

    klar, aber ich kann es erkennen, wenn ich den code sehe:
    - die get-funktion setzt i immer auf 7 und gibt immer 5 zurück.
    - die set-funktion shiftet eine variable 'outFile' um 'a' bits nach links.
    die funktionen tun also nicht das, was man bezüglich ihrer namen von ihnen erwarten würde.
    hättest du aber einen der operatoren, das = oder das << überladen, dann würde man schon weniger aussagen über den code machen können:
    - die get-funktion gibt immer 5 zurück
    alles andere bliebe im dunkeln.
    🙂



  • pale dog schrieb:

    man kann damit sehr leicht unlesbaren code erzeugen und es ist nur 'syntaktischer zucker', also nichts, was man beim programmieren wirklich vermissen würde.

    Du siehst die Sache genau falsch herum. SZ, und im besonderen Op-Überladung, ermöglicht die Erzeugung von lesbarerem Code, dafür ist die Sache nämlich da.

    Würdest du Operatoren für int s etc. auch "nicht wirklich vermissen"?



  • pale dog schrieb:

    in einem quelltext sieht man aber 'a = b + c;' und das sieht aus wie die addition zweier primitiver datentypen.

    Das mag für dich so aussehen. Ich sehe da einen operator+ und einen operator=, und weiß, was das bedeuten kann.

    Kann es sein, dass deine Verwirrung einfach nur durch diese verschobene Wahrnehmung verursacht wird, möglicherweise weil du sehr lange mit einer Sprache zu tun hattest, die keine Operatorüberladung kennt?



  • pale dog schrieb:

    es gibt den '+' operator schon, er tut genau das, was man von ihm erwartet: addieren.

    Nur funktioniert er für Matrizen nicht.

    EDIT: Oh, da war ja noch ne Seite. *peinlich*



  • pale dog schrieb:

    rüdiger schrieb:

    Warum sollte es einen syntaktischen Unterschied geben, wenn ich zwei Integer addiere oder zwei Bignums?

    ja, aber da hast du wirklich die einzig sinnvolle anwendung hervorgekramt 😉
    doch wie sieht's in der realität aus? op-überladung (+) wird z.b. genommen, um strings zusammenzufügen (wobei das ist noch nicht mal des schlechteste beispiel).
    aber echt übel: denk doch mal an C++ iostreams, wie da die shift-operatorn missbraucht werden.
    *das* ist richtig mies!

    Eigentlich machen die Shift-Operatoren für die Streams sogar sehr viel sinn, aber du bist dafür eh nicht offen, deshalb spare ich mir die Zeit für eine Erklärung.


Anmelden zum Antworten