In C ist der Prototyp für die Absolutwertfunktion (die einen Float akzeptiert)
float fabsf( float );
Warum akzeptiert dieser Prototyp keinen konstanten Wert wie diesen:
float fabsf( float const );
fabsf wird den Wert der Eingabe nicht ändern, oder?
Wenn ich eine Funktion habe, die eine Eingabe akzeptiert und fabsf aufruft, muss ich dann vermeiden, die Eingabe als const anzugeben?
Was ist der geeignete Weg, um in dieser Situation mit konstanter Korrektheit umzugehen?
c
function
const
pass-by-value
user24205
quelle
quelle
const
ist hier überflüssig, was denkst du passiert?const
völlig bedeutungslos.float const x = -1.0; float y = fabsf(x);
so scheint es mir , dassfabsf
tut const - Eingänge. Es gibt keine Möglichkeit zu sagen: "Sie können mir einenfloat
Wert übergeben, aber Sie können einen nicht übergebenconst float
." (Und wie wir in den Antworten sehen, bietet C keine Möglichkeit, zu verlangen, dass die Eingabe für eine Funktion a istfloat const
.)Antworten:
Bearbeiten
Wie MM kommentierte, wird bei Parametern in Prototypen das
const
ignoriert. Die bearbeitete Quelle der ursprünglichen Antwort (siehe unten) zeigt Folgendes:Es gibt keine Fehlermeldung.
Wie auch immer, ich werde das Original an Ort und Stelle lassen, in der Hoffnung, dass es helfen könnte.
Original
Der
const
Parameter at a macht diesen Parameter innerhalb der Funktion schreibgeschützt.Zum Beispiel:
Diese Quelle wird nicht ohne Fehlermeldung kompiliert.
Die Funktion
correct()
liest den angegebenen Wert, ändert sein Vorzeichen und gibt den negierten Wert zurück.Die Funktion
erroneous()
scheint effektiv dasselbe zu tun, außer dass dem Parameter eine Zuordnung vorliegt. Da der Parameter jedoch ist, istconst
dies nicht zulässig.Als nächstes funktioniert die Funktion
changer()
wie beide zuvor, gibt jedoch keine Fehler aus.Schauen wir uns die Anrufseite an:
Die
f
als Argument angegebene Variable wird in den Parameter kopiertvalue
. Es wird sich nie ändern, auch wennchanger()
es aufgerufen wird.Möglicherweise möchten Sie Parameter als eine Art lokale Variablen betrachten. Tatsächlich werden sie im generierten Maschinencode meistens so behandelt.
Also, warum siehst du
const
manchmal? Sie sehen es, wenn ein Zeiger als Parameter definiert ist.Wenn Sie nicht möchten, dass der Wert , auf den gezeigt wird, geändert wird, müssen Sie hinzufügen
const
. aber mach es an der richtigen Position!quelle
float fabsf( float const );
bezieht sich jedoch auf Prototypen, der Prototyp hat nichts mit der Funktionsimplementierung zu tun (die das nicht wiederholen mussconst
), tatsächlichconst
wird die im Prototyp vollständig ignoriertC verwendet den Pass-by-Wert. Der Wert für den Parameter einer Funktion ist eine Kopie des von Ihnen angegebenen Arguments.
Es ist in Ordnung, sowohl const- als auch non-const-Floats zu kopieren, und das Ergebnis ist ein non-const-Float.
Es ist ähnlich wie bei der Zuordnung:
Tatsächlich gibt die Sprache an, dass der Wert eines Ausdrucks niemals sein kann
const
, dh wenn ein Wert aus einer Variablen gelesen wird, ist dieser Wert nichtconst
einmal, wenn die Variable war.quelle
Da die C-Sprache die Semantik für die Übergabe von Werten verwendet , wirkt sich jedes Argument, das Sie an sie übergeben, nicht direkt auf den Wert aus, den Sie übergeben, obwohl es intern geändert werden könnte.
Dies bedeutet, dass aus Sicht des Anrufers
float fabsf( float );
undfloat fabsf( const float );
sind die gleichen. Es macht also keinen Sinn, den Parameter zu machenconst
.Wo es tut sinnvoll zu verwenden
const
ist , wenn der Parameter Sie in geben einen Zeiger ist, zum Beispiel:Diese Funktion kann trotz des Namens den angegebenen Zeiger dereferenzieren und ändern, was er zeigt, dh
str[0] = 'x'
zu einer Änderung führen, die von der aufrufenden Funktion angezeigt werden kann. Wenn diese Funktion folgendermaßen definiert wäre:Dem Aufrufer wird sichergestellt, dass die Funktion keine Änderungen an den
str
Punkten vornehmen kann, auf die verwiesen wird .quelle
((char*)str)[0] = 'f'
. B.: . Dieconst ... *
in der Argumentliste enthaltene ist daher nur eine "Absichtserklärung".So fügen Sie eine Perspektive für einen Sprachanwalt hinzu:
Das heißt, diese beiden sind kompatibel:
Daher können Sie den Prototyp mit oder ohne schreiben
const
(was bedeutet, dass ohne sinnvoller ist; weniger zu tippen / lesen) undconst
die Funktionsdefinition hinzufügen, wenn Sie vermeiden möchten, dass der Parameter (kopiert - Aufruf nach Wert!) In den Funktionen versehentlich geändert wird Körper.quelle