Wie kann ich hier auf die außerhalb der for-loop definierte Variable zugreifen
-
Hallo

Überschreibe das original in der main() definierte i in der for-loop. Habe einige Kenntnisse in Java, da wäre so etwas nicht gegangen, zu meiner Überraschung kann ich das i in der for-loop überschreiben. Ist eine Aufgabe aus dem C++-Primer (man soll rausfinden, ob das lauffähig ist). Nun frage ich mich allerdings, wie ich an das äußere i komme, wenn ich es denn doch brauche? Der ::-Operator scheint nur für globale Variablen zu funktionieren, jedenfalls spuckt mir der Compiler einen Fehler aus, wenn ich das tue.
#include <iostream> using namespace std; int main() { int i = 100, sum = 0; for (int i = 0; i != 10; ++i) { sum += i; cout << i << endl; } cout << i << " " << sum << endl; cin.get(); return 0; }Edit:
Habe gerade gelesen, dass es in C++ Referenzen gibt, mit der wäre es z.B. möglich, indem ich für das äußere i eine Referenz anlege, zum Beispiel:int &x = i;Gibt es allerdings keine andere Methode?
-
Doch, gib dem inneren
ieinfach einen anderen Namen.
-
Fytch schrieb:
Doch, gib dem inneren
ieinfach einen anderen Namen.Schon klar, dass das geht...
Aber wenn ich gerade das NICHT tun möchte, gibt es dann keine Möglichkeit, an das äußere i zu kommen, ohne eine Referenz oder einen Pointer dazu?
-
Nein, gibt es nicht. Wäre das äußere
iim gemeinsamen Klassen-Scope, dann gingethis->ioder wäreiim gemeinsamennamespace-Scope, dann ginge:: ( Name der namespaces:: ) i, z.B.::foo::bar::i. Bei deinem Beispiel, wo beide Variableniim selben Funktions-Scope sind, gibt es in der Tat keine Möglichkeit.
-
Gut, danke für die Antwort
Wollte es nur genau wissen. Finde es nur etwas komisch, dass das doppelte Benutzen dieser Variable nicht verboten wird. Ist wohl Geschmackssache, aber ich fände es so deutlich logischer.
-
non schrieb:
Finde es nur etwas komisch, dass das doppelte Benutzen dieser Variable nicht verboten wird.
Es ist ja nicht die Variable, die doppelt verwendet wird, sondern nur der Name. Die Schleife für sich hat ja keine Probleme; warum sollte es von Bedeutung sein, dass ein äußerer Scope zufällig den gleichen Namen für etwas anderes verwendet?
-
Also ich denke, man sollte nicht mehrere gleichlautende Variablen in einer Funktion nutzen, das trägt nur zur Verwirrung bei.
Wenn du das doch hast, verwende entweder einen anderen Namen - oder ggf. ist es sogar ein Zeichen, dass du das, was du mit der "inneren" Variablen machst, in eine Funktion auslagern solltest.
Du kannst dem Compiler aber sagen, dass er dich warnen soll, wenn du gleiche Namen benutzt, die sich verstecken: kompiliere mit -Wshadow (natürlich auch mit -Wall und -Wextra)! Und wenn du dann noch -Werror setzt, kompiliert dein Code auch nicht mehr

Dann kommt heraus (bei clang++-3.9 -Wall -Wextra -Wshadow test.cpp):
test.cpp:9:10: warning: declaration shadows a local variable [-Wshadow] for (int i = 0; i != 10; ++i) ^ test.cpp:7:5: note: previous declaration is here int i = 100, sum = 0; ^ 1 warning generated.
-
wob schrieb:
Also ich denke, man sollte nicht mehrere gleichlautende Variablen in einer Funktion nutzen, das trägt nur zur Verwirrung bei.
Jain.
Mehrfach mit Überschneidungen beim Gültigkeitsbereich finde ich auch ziemlich übel.
Mehrfach ohne Überschneidungen ... mache ich oft. z.B. mehrere Loops hintereinander mit jeweils "i" als Laufvariable. Wieso nicht?
-
hustbaer, stimme dir voll zu - so hatte ich das auch gemeint (nach Neulesen meines Beitrags war dieser nicht klar genug formuliert)!
Der Schalter-Wshadowmeckert es ja auch nicht an, wenn du mehrere for-Schleifen mit i als Zähler hintereinander hast. Das ist natürlich ok. Aber nicht ok sind verschachtelte for-Schleifen mit demselben Namen.