Konstaten wirklich invariabel?
-
@SeppJ sagte in Konstaten wirklich invariabel?:
es war stets nur auf Hochspachenebene als Hilfsmittel für den Programmierer gedacht
Viel mehr wollte ich auch gar nicht beitragen, vor allem da mir die Intention komplett unklar ist.
-
Nein, Konstanten sind nicht invariabel.
In C++ sind die im Gegensatz zu C invariabel. Ein Lesezugriff wird immer zur Compile-Zeit "geerdet".
Du kannst zwar das const per const_cast wegcasten und der Compiler darf theoretisch die Variable dann ins Binary nehmen und dort auch schreiben, aber er darf auch den Schreibzugriff wegoptimieren. MSVC und g++ tun das entsprechend, clang tut das nicht.
-
Wenn du glaubst, hier gäbe es irgendwelche Unterschiede zwischen C und C++, dann ist schon deine Eingangsannahme komplett falsch.
-
@SeppJ sagte in Konstaten wirklich invariabel?:
Wenn du glaubst, hier gäbe es irgendwelche Unterschiede zwischen C und C++, dann ist schon deine Eingangsannahme komplett falsch.
Doch, hier gibt es einen Unterschied zwischen C und C++. Weil in C const-Werte nicht immer compile-time-konstant sind nutzt man ja #define's für Konstanten. In C++ ist das nicht mehr nötig.
-
Wo ist da die compile-time-konstante?
void func(const int x) { std::cout << x; } int main() { int y; if(std::cin >> y) { func(y); } }
-
@Flodul sagte in Konstaten wirklich invariabel?:
@SeppJ sagte in Konstaten wirklich invariabel?:
Wenn du glaubst, hier gäbe es irgendwelche Unterschiede zwischen C und C++, dann ist schon deine Eingangsannahme komplett falsch.
Doch, hier gibt es einen Unterschied zwischen C und C++. Weil in C const-Werte nicht immer compile-time-konstant sind nutzt man ja #define's für Konstanten. In C++ ist das nicht mehr nötig.
Das ist ein rein syntaktischer Unterschied.
-
@LeMace sagte in Konstaten wirklich invariabel?:
Wo ist da die compile-time-konstante?
void func(const int x) { std::cout << x; } int main() { int y; if(std::cin >> y) { func(y); } }
Nirgends. Und ...?
-
@LeMace sagte in Konstaten wirklich invariabel?:
Wo ist da die compile-time-konstante?
void func(const int x) { std::cout << x; } int main() { int y; if(std::cin >> y) { func(y); } }
Ne, da nicht. Aber wenn Du sowas schreibst wie
int const abc = 123;
dann kannst Du das const beliebig wegcasten und darauf schreiben - ein Lesezugriff darauf bleibt immer konstant (und der Schreibzugriff wird i.d.R. wegoptimiert).
-
@Flodul sagte in Konstaten wirklich invariabel?:
Ne, da nicht. Aber wenn Du sowas schreibst wie
int const abc = 123;
dann kannst Du das const beliebig wegcasten und darauf schreiben - ein Lesezugriff darauf bleibt immer konstant (und der Schreibzugriff wird i.d.R. wegoptimiert).Wenn du das gleiche Programm mit einem C-Compiler übersetzt, passiert aber dasselbe.
-
@Flodul sagte in Konstaten wirklich invariabel?:
dann kannst Du das const beliebig wegcasten und darauf schreiben
... und hast damit UB.
-
dann kannst Du das const beliebig wegcasten und darauf schreiben
... und hast damit UB.
Theoretisch, praktisch optimiert dir das jeder Compiler weg.
-
Kennt ihr dieses Gefühl von Deja-Vu, wenn man einen Thread liest, wo sich die gleiche Diskussion noch einmal wiederholt, weil ihn irgendjemand nach einer Woche wieder nach oben gepusht hat, ohne die vorherigen Antworten zu lesen?