Warum hat man den Rückgabewert von strcmp so dämlich gewählt?


  • Mod

    DirkB schrieb:

    6. C ist nicht für Anfänger gedacht.

    Trotzdem gilt, dass dieser Fall keine Raketenwissenschaft ist. Die Motzer in diesem Thread verwechseln Gleichheit mit einer Ordnungsrelation und sind zu faul (oder eher: nicht interessiert), den Unterschied zu lernen, oder gar mal nachzudenken, wozu man wohl eine Ordnungsrelation für Zeichenketten brauchen könnte. Das Problem liegt eindeutig bei den Motzern selbst. "Ich kapier es nicht, also muss es dämlich sein, denn ich bin schließlich furchtbar klug. Aber ich will auch nicht erklärt bekommen, wieso das so ist".



  • Ich verstehe es und verstand es auch vor deinem schlauen Beitrag. Ich finde es trotzdem Scheisse. Und zwar weniger dass es die strcmp() Funktion gibt und wie deren Returnwert aussieht, sondern mehr dass es eben keine streq() Funktion in der libc gibt. Weil der Effekt davon ist dass jeder strcmp() == 0 schreibt, weil es jedem komisch/unpassend vorkommt sich so eine kleine "unnötige" Hilfsfunktion selbst schreibt. Und der Effekt davon ist wiederrum dass wir haufenweise Code haben der schlechter zu lesen ist als er es sein müsste.

    SeppJ schrieb:

    "Ich kapier es nicht, also muss es dämlich sein, denn ich bin schließlich furchtbar klug. Aber ich will auch nicht erklärt bekommen, wieso das so ist".

    Ich hab überhaupt kein Problem, da ich nicht kaum jemals C programmieren muss. Ein Problem haben die Leute die vor Lauter Müll die Müllhalde nicht sehen und für die grüne grüne Wiese halten.



  • hustbaer schrieb:

    Weil der Effekt davon ist dass jeder strcmp() == 0 schreibt,

    Nö.
    Da wird !strcmp() hingeschrieben.

    Ja, das sieht noch unleserlicher aus und ja, hätte, hätte, hätte.

    Wurde alles nicht gemacht, das war für die Erfinder von C auch nicht wichtig.
    (Das Konzept ist jetzt fast 50 Jahre alt. )

    Und, C ist nicht für Anfänger gedacht.



  • Gast3 schrieb:

    nur Anfänger schreiben sich keine Hilfsroutinen um "Probleme" zu lösen, es gibt keine Mindestgröße für ein Problem ab der man sich erst eine Hilfsroutine bauen darf
    bool strequal(...){ return strcmp(...) == 0; }

    Das ist nicht performant.
    Eher baue ich mir mein eigenes strequal, aber ohne Verwendung von strcmp.



  • DirkB schrieb:

    hustbaer schrieb:

    Weil der Effekt davon ist dass jeder strcmp() == 0 schreibt,

    Nö.
    Da wird !strcmp() hingeschrieben.

    Egal welche Variante genommen wird, beides ist unleserlich, birgt Fehlerquellen und ist auch noch langsam, weil jedes mal eine Negation notwendig ist.

    Würde es strequal in der libc geben, die einen Boolwert zurück liefert, dann gäbe es dieses Problem nicht.

    Mal davon abgesehen, dass ihr euch jetzt widersprecht.
    Du sagst, !strcmp() wäre richtig und BooleanInteger hält es für eine stillistische Unart und empfiehlt deswegen strcmp() == '\0'
    https://www.c-plusplus.net/forum/p2544943#2544943

    Da habt ihr also in der C Community verschiedene Varianten, jeder macht es anders, ein purer Wildwuchs ist da vorprogrammiert und alles nur, weil es kein strequal() in der libc gibt.



  • Halt einfach die Klappe.
    Kommst du dir nicht selbst lächerlich vor, als Laie Erfindern der verbreitetsten Programmiersprache der Welt Dämlichkeit vorzuwerfen?
    C ist von Profis für Profis entwickelt worden - keinesfalls jedoch vor 45 Jahren, damit auch noch nach 45 Jahren der letzte Depp mit beschränktem Horizont und grundsätzlich naiver Vorstellungswelt sofort alles intuitiv begreift.
    Trolle dich zu Java zurück und halte deine Klappe wenn Erwachsene sich unterhalten.



  • Nicht logisch definiert schrieb:

    Du sagst, !strcmp() wäre richtig

    1. Ist das richtig (es funktioniert und ist vom Standard gedeckt)
    2. meinte ich damit, das der weit größte Teil der C-Programmierer das so macht.

    Es werden Kriege um den richtigen Einrücksstil geführt.
    Da ist der Wildwuchs um ein ! oder == 0 doch er ein Scharmützel (gerade bei strcmp)

    Nicht logisch definiert schrieb:

    und BooleanInteger hält es für eine stillistische Unart und empfiehlt deswegen strcmp() == '\0'

    Das tut er garantiert nicht!.
    Es geht um den Stringterminator.
    Darum, dass man ihn hinschreibt. Als Zeichen (nicht als numerischen Wert)



  • Wutz schrieb:

    von Profis für Profis

    Falls du welche kennst könntest du die ja mal fragen was sie davon halten.



  • Nicht logisch definiert schrieb:

    Gast3 schrieb:

    nur Anfänger schreiben sich keine Hilfsroutinen um "Probleme" zu lösen, es gibt keine Mindestgröße für ein Problem ab der man sich erst eine Hilfsroutine bauen darf
    bool strequal(...){ return strcmp(...) == 0; }

    Das ist nicht performant.
    Eher baue ich mir mein eigenes strequal, aber ohne Verwendung von strcmp.

    Keine ahnung was du meinst - als header only implementation ist der overhead zum direkten aufruf exakt 0, wird komplett weg optimiert (schau dir den assemblercode an), war schon vor 30 jahren so



  • Und was willst du da überhaupt optimieren?

    Glibc strcmp.c git head

    Die meisten implementationen sehen genau so aus, meist sogar noch von den kompiler sonderbehandelt und direkt durch inline code ersetzt



  • fehlendes Feedback ist meist dann noch das i-Tüpfelchen auf der schlechten Darstellung


Anmelden zum Antworten