Ich sehe mir einen Code für eine Methode der kleinsten Quadrate an und bin auf die folgenden Zeilen gestoßen:
%Vor% und ich habe mich gefragt, warum jemand ein static
für 1.0
definieren würde. Ich kann zum Beispiel etwas für pi
verstehen, aber für triviale mathematische Werte wie 1.0
und 0.1
usw.? Ich denke, es wird den Code weniger lesbar machen, aber es könnte andere Vorteile haben, die ich vermisse.
Also, gibt es einen Grund für diese Definitionen? oder, wenn es nicht mit modernen Codes verwendet wird, gab es Gründe dafür mit alten Compilern? Ich weiß, dass der Code, den ich sehe, von FORTRAN in C / C ++ übersetzt wurde. Gab es Gründe dafür in FORTRAN?
Ich weiß, dass der Code, den ich sehe, in C / C ++ übersetzt wurde Fortran. Gab es Gründe dafür in FORTRAN?
FORTRAN verwendet den Pass-by-Reference für alle Subroutinenparameter. Im Gegensatz zu anderen Sprachen mit Pass-by-Reference können Sie jedoch "rvalues" als Parameter übergeben. Hinter den Kulissen konvertiert der FORTRAN-Compiler Code wie:
%Vor%um zu codieren wie
%Vor%Und genau das macht Ihr C ++ - Code: Erstellen von Variablen, um einen Zeiger (oder eine Referenz) an eine FORTRAN-ähnliche Subroutine zu übergeben.
Natürlich ist das kein idiomatisches C oder C ++. Normalerweise übergeben Sie double
nach Wert .
(Codebeispiele aus meiner Antwort kopiert nach diese Frage .)
Verwendung von
%Vor%ergibt für mich keinen Sinn. Es wäre sinnvoll, wenn die Variablen mit etwas aussagekräftiger benannt worden wären. Ich sehe den Wert von etwas wie:
%Vor%Im zweiten Satz ist die Verwendung der Variablen im Code viel aussagekräftiger als die Verwendung der entsprechenden Konstanten.
Es wäre sinnvoller, sie konstant zu machen.
%Vor%Ich weiß, dass der Code, den ich sehe, von FORTRAN in C / C ++ übersetzt wurde.
Wenn die Übersetzung von einem Programm ausgeführt wurde, ist es verständlich, warum die Variablen so benannt werden, wie sie sind.
Wenn die Übersetzung von einem Menschen gemacht wurde, folgten sie wahrscheinlich einer Richtlinie, wie man Dinge schnell bewegt und nicht unbedingt aussagekräftige Variablennamen durch Verstehen des Codes erstellt.
Ein Fall, in dem ich gesehen habe, dass dies verwendet wird, ist auf einigen (älteren, eingebetteten) Plattformen, die eine Harvard-Architektur verwenden.
Angenommen, ich habe eine Funktion (externe Bibliothek), die einen Zeiger als Argument verwendet:
%Vor% Wenn ich eine Konstante an diese Funktion übergeben will, kann ich sie natürlich nicht direkt schreiben. Ich muss es wie im Eröffnungsbeitrag tun, also kann ich zum Beispiel die Adresse von one
übernehmen.
Auf einigen Harvard-Plattformen werden const
-Werte in Programm-ROM oder Flash-Speicher anstelle von RAM eingegeben, so dass dies nicht funktioniert, da Sie die ROM-Adresse anstelle der erforderlichen RAM-Adresse verwenden würden.
Es wird dann zu einer globalen (statischen) Variable gemacht, so dass es einmal im Startup-Code initialisiert wird (Wert einmal vom ROM zum RAM kopiert) und nicht jedes Mal, wenn es benötigt wird, indem man es zu einer automatischen Variable macht.
>Ein Nischen-Anwendungsfall gebe ich zu.
Nein, diese Konstante ist albern. Wenn aus keinem anderen Grund als es ist eigentlich keine Konstante .
Es gibt tatsächlich einen guten Grund, dies zu tun, und es beinhaltet den Software-Entwicklungsprozess selbst.
Nehmen wir an, Sie haben eine Übersetzungseinheit, die eine Funktion mit einem numerischen Parameter aufruft. Natürlich würden Sie sie zu einer Konstante machen:
%Vor%Netter, sauberer Code. Aber jetzt erkennst du, dass das Epsilon, das du gesetzt hast, nicht so gut ist und du ein besseres brauchst. Sie haben nicht wirklich einen sicheren Weg, um zu bestimmen, was es sein sollte, also gehen Sie zu Versuch und Irrtum:
%Vor%Sie bauen Ihr Programm neu auf. Und es ist immer noch nicht gut. Wenn Sie es erneut ändern, müssen Sie warten, bis der Build abgeschlossen ist, und bei einigen nicht-trivialen Projekten kann es eine Weile dauern. Was zu tun ist?
Nun, Debugger lassen Sie den Wert von Variablen ändern, solange sie sich im Speicher befinden (und nicht eliminiert werden wie echte Konstanten). Also machen wir folgendes:
%Vor% Jetzt setzen wir irgendwo in dieser Datei einen Haltepunkt. Und wir können epsilon
ändern, ohne jedes Mal unser Programm neu zu erstellen. Wir sparen wertvolle Entwicklungszeit. Und wir finden einen richtigen Wert in kürzester Zeit.
Lassen wir es nicht const
? Nein. Dies ist eine Konstante, und deshalb markieren wir sie als const
, bevor wir unseren Code überprüfen. Wenn Sie ihn nicht-const ist ein Code-Geruch. Es gibt keinen weiteren Grund dafür.