Warum Konstanten beim Programmieren verwenden? [closed]

Lesezeit: 8 Minuten

Benutzeravatar von Adam N
Adam N

Ich habe gerade ein bisschen C-Lernen mit Hilfe von Ivor Hortons Beginning C-Buch durchgesehen. Ich bin zu dem Teil über die Deklaration von Konstanten gekommen, der im selben Satz mit Variablen verwechselt zu werden scheint.

Nur zur Verdeutlichung, was ist der Unterschied bei der Angabe von Konstanten und Variablen in C, und wann müssen Sie wirklich eine Konstante anstelle einer Variablen verwenden? Ich weiß, dass Leute sagen, dass man eine Konstante verwenden soll, wenn sich die Informationen während der Programmausführung nicht ändern, aber ich kann mir nicht wirklich vorstellen, dass eine Variable nicht stattdessen verwendet werden könnte.

  • Feste Länge spart Speicher, wo im schlimmsten Fall das Kopieren in ein neues Array funktioniert

    – Niklas Rosenkranz

    1. Juni 2010 um 22:15 Uhr

  • Diese Frage erfordert nur ein Gegenbeispiel: Warum würden Sie PI zu einer Variablen machen?

    – Hans Passant

    1. Juni 2010 um 22:30 Uhr

  • @ Hans Passant: Bist du sicher, dass Pi eine Konstante ist? Bisher wurde es nur in der Nähe der Erde gemessen. Sind Sie sicher, dass es im gesamten Raum-Zeit-Kontinuum konstant ist?

    Benutzer151323

    1. Juni 2010 um 22:35 Uhr


  • Zugegeben, ein Wert von “3” ist nicht unwahrscheinlich in der Nähe des Horizonts eines Schwarzen Lochs. Was auch eine Neudefinition des Bool-Typs erfordert, muss “Datei unwiederbringlich verloren” hinzufügen.

    – Hans Passant

    1. Juni 2010 um 22:45 Uhr

  • @Developer Art: Pi ist eine abstrakte mathematische Konstante, die unabhängig vom physischen Raum ist, ebenso wie jede andere mathematische Konstante.

    – David R. Tribble

    2. Juni 2010 um 0:13 Uhr

Benutzeravatar von Uri
Uri

Wie der Name schon sagt, verändert sich eine Variable im Laufe der Zeit. Wenn es sich nicht ändert, gibt es “keinen Verlust”. Wenn Sie dem Compiler mitteilen, dass sich der Wert nicht ändern wird, kann der Compiler eine ganze Reihe von Optimierungen vornehmen, z. B. den Wert direkt inlinieren und niemals Platz für die Konstante auf dem Stapel zuweisen.

Sie können sich jedoch nicht immer darauf verlassen, dass Ihr Compiler intelligent genug ist, um korrekt zu bestimmen, ob sich ein einmal festgelegter Wert ändert. In jeder Situation, in der der Compiler nicht in der Lage ist, dies mit 100%iger Sicherheit zu bestimmen, wird der Compiler auf Nummer sicher gehen und davon ausgehen, dass es sich ändern könnte. Dies kann zu verschiedenen Leistungseinbußen führen, z. B. das Vermeiden von Inlining, das Nichtoptimieren bestimmter Schleifen und das Erstellen von Objektcode, der nicht so parallelitätsfreundlich ist.

Aus diesem Grund und da auch die Lesbarkeit wichtig ist, sollten Sie sich bemühen, wann immer möglich eine explizite Konstante zu verwenden und Variablen für Dinge zu lassen, die sich tatsächlich ändern können.

Warum Konstanten anstelle von Literalzahlen verwendet werden:

1) Es macht Code besser lesbar. Jeder weiß, was 3,14 ist (hoffentlich), nicht jeder weiß, dass 3,07 der Einkommensteuersatz in PA ist. Dies ist ein Beispiel für domänenspezifisches Wissen, und nicht jeder, der Ihren Code in Zukunft pflegt (z. B. eine Steuersoftware), wird es kennen.

2) Es spart Arbeit, wenn Sie eine Änderung vornehmen. Gehen und ändern alle 3.07 bis 3.18, wenn sich der Steuersatz in Zukunft ändert, wird ärgerlich sein. Sie möchten Änderungen immer minimieren und idealerweise eine einzige Änderung vornehmen. Je mehr gleichzeitige Änderungen Sie vornehmen müssen, desto höher ist das Risiko, dass Sie etwas vergessen und zu Fehlern führen.

3) Sie vermeiden riskante Fehler. Stellen Sie sich vor, es gäbe zwei Staaten mit einem Einkommensteuersatz von 3,05, und dann ändert sich einer von ihnen auf 3,18, während der andere bei 3,07 bleibt. Wenn Sie einfach gehen und ersetzen, könnten Sie mit schwerwiegenden Fehlern enden. Natürlich sind viele Integer- oder String-Konstantenwerte häufiger als “3.07”. Beispielsweise könnte die Zahl 7 die Anzahl der Tage in der Woche und etwas anderes darstellen. In großen Programmen ist es sehr schwierig festzustellen, was jeder Literalwert bedeutet.

4) Im Fall von Zeichenfolgentext ist es üblich, symbolische Namen für Zeichenfolgen zu verwenden, damit sich die Zeichenfolgenpools im Fall der Unterstützung mehrerer Sprachen schnell ändern können.

Beachten Sie, dass es neben Variablen und “konstanten Variablen” auch einige Sprachen mit Aufzählungen gibt. Eine Aufzählung ermöglicht es Ihnen tatsächlich, einen Typ für eine kleine Gruppe von Konstanten (z. B. Rückgabewerte) zu definieren, sodass ihre Verwendung Typsicherheit bietet.

Wenn ich zum Beispiel eine Aufzählung für die Wochentage und für die Monate habe, werde ich gewarnt, wenn ich einem Tag einen Monat zuordne. Wenn ich nur ganzzahlige Konstanten verwende, gibt es keine Warnung, wenn Tag 3 Monat 3 zugewiesen wird. Sie wollen immer Typsicherheit, und das verbessert die Lesbarkeit. Aufzählungen eignen sich auch besser, um die Reihenfolge zu definieren. Stellen Sie sich vor, Sie haben Konstanten für die Wochentage und möchten jetzt, dass Ihre Woche am Montag und nicht am Sonntag beginnt.

  • OP fragt nicht nach Literalen. Die Frage war, WARUM Konstanten verwendet werden, wenn sich die Dinge nicht ändern … warum nicht einfach Variablen für alles verwenden? Es ist nicht so, dass wir ausgehen werden …

    – Brian Postow

    1. Juni 2010 um 22:00 Uhr

  • Ich denke, der erste Absatz meiner Antwort beantwortet Folgendes: Es ist nicht erforderlich, eine Variable zu verwenden, wenn sie sich im Laufe der Zeit nicht ändert. Aber ich werde dies noch näher erläutern.

    – Uri

    1. Juni 2010 um 22:02 Uhr

  • Ich würde auch hinzufügen: 5) Typsicherheit.

    – matias

    1. Juni 2010 um 22:03 Uhr

  • Nein, ich stimme Brian zu, zu viele Informationen, total. Aber noch einmal, was wird der Titel die Leute hier erwarten lassen?

    – James Morris

    2. Juni 2010 um 0:43 Uhr


  • 3.14 ist offensichtlich ((e*phi)^(phi/2)-3) << 1

    – Mateen Ulhaq

    20. Oktober 2011 um 5:21 Uhr


Die Verwendung von Konstanten ist eher eine Art der defensiven Programmierung, um sich selbst davor zu schützen, versehentlich den Wert irgendwo im Code zu ändern, wenn Sie um 2 Uhr morgens programmieren oder bevor Sie Ihren Kaffee getrunken haben.

Technisch gesehen können Sie stattdessen eine Variable verwenden.

  • @wallacoloo: Natürlich danke. Das passiert, wenn man um 00:00 Uhr eine Antwort schreibt. 🙂

    Benutzer151323

    1. Juni 2010 um 22:04 Uhr


  • Vergiss nicht, schlafen ist auch eine defensive Programmiertaktik.

    – Jackson

    18. September 2016 um 18:19 Uhr

  • Du meinst so? 😉 startBackgroundProcess(); schlafen (1000); // Stellen Sie sicher, dass der Prozess abgeschlossen ist, beginnend mit useBackgroundProcesses();

    – Entenhirn

    31. Juli 2017 um 19:51 Uhr


Konstanten haben gegenüber Variablen mehrere Vorteile.

Konstanten bieten eine gewisse Garantie, dass Code den zugrunde liegenden Wert nicht ändern kann. Dies ist für ein kleineres Projekt nicht von großer Bedeutung, aber für ein größeres Projekt mit mehreren Komponenten, die von mehreren Autoren geschrieben wurden.

Konstanten geben dem Compiler auch einen starken Hinweis zur Optimierung. Da der Compiler weiß, dass sich der Wert nicht ändern kann, muss er den Wert nicht aus dem Speicher laden und kann den Code so optimieren, dass er nur für den genauen Wert der Konstante funktioniert (der Compiler kann beispielsweise Verschiebungen für Multiplikation/Division verwenden wenn die Konstante eine Potenz von 2 ist.)

Konstanten sind auch von Natur aus statisch – Sie können die Konstante und ihren Wert in einer Header-Datei deklarieren und müssen sich nicht darum kümmern, sie genau an einer Stelle zu definieren.

  • Eine solche Garantie kann das spätere Debuggen und die Wartung viel einfacher machen – wenn etwas eine Variable ist, werden Sie oft feststellen, dass Sie nach irgendwelchen Stellen im Code suchen, die es ändern; Wenn es eine Konstante ist, können Sie das vermeiden.

    – Café

    1. Juni 2010 um 23:32 Uhr

Zum einen die Leistungsoptimierung.

Noch wichtiger ist, dass dies für menschliche Leser ist. Denken Sie daran, dass Ihre Zielgruppe nicht nur der Compiler ist. Es hilft, sich in Code auszudrücken und Kommentare zu vermeiden.

const int spaceTimeDimensions = 4;

if(gpsSattelitesAvailable >= spaceTimeDimensions)
  Good();

Für eine Low-Level-Sprache wie C ermöglichen Konstanten mehrere Kompilierungsoptimierungen.

Für eine Programmiersprache im Allgemeinen braucht man sie nicht wirklich. Dynamische Hochsprachen wie Ruby und JavaScript haben sie nicht (oder zumindest nicht im wirklich konstanten Sinne). Stattdessen werden Variablen verwendet, genau wie Sie vorgeschlagen haben.

Benutzeravatar von Peter Mortensen
Peter Mortensen

Konstant ist, wenn Sie nur die Erinnerung teilen möchten und sie sich nicht ändert.

Benutzeravatar von James Morris
James Morris

Das const Das Schlüsselwort wird häufig für Funktionsparameter, insbesondere Zeiger, verwendet, um darauf hinzuweisen, dass der Speicher, auf den der Zeiger zeigt, von der Funktion nicht geändert wird. Sehen Sie sich die Deklaration an strcpy zum Beispiel:

char *strcpy(char *dest, const char *src);

Ansonsten wäre zum Beispiel eine Deklaration wie

const int my_magic_no = 54321;

könnte bevorzugt werden gegenüber:

#define MY_MAGIC_NO 54321

aus Typensicherheitsgründen.

  • Uhh, ich habe gerade festgestellt, dass ich die Frage, warum Konstanten anstelle von Variablen verwendet werden, nicht wirklich anspreche.

    – James Morris

    1. Juni 2010 um 21:55 Uhr

  • Ich glaube nicht, dass OP nicht nach Parametern fragt, sondern nach lokalen Variablen …

    – Brian Postow

    1. Juni 2010 um 22:01 Uhr

  • Danke Brian für den Hinweis. Als wäre mir das noch nicht aufgefallen ;-|

    – James Morris

    1. Juni 2010 um 22:04 Uhr

1386380cookie-checkWarum Konstanten beim Programmieren verwenden? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy