2015-09-01 16 views
6

Warum darf ich keine Variable verwenden, die ich innerhalb do deklariert habe und sie innerhalb des while Teils einer do/while-Schleife verwenden?Kann keine Variable in while-Klausel verwenden, die in der do/while-Schleife deklariert wird

Das erste Mal, als ich das sah, dachte ich, es wäre ein Compiler Bug. Also habe ich Visual Studio mehrere Male neu gestartet, aber immer noch erkennt es die Variable in while nicht.

Was ist falsch mit dem Code, oder ist das ein Compiler Bug?

+3

Variable Scoping nachschlagen. 'composite' existiert nur im Rahmen Ihrer do while-Schleife und nicht außerhalb davon. – Brandon

+0

ich konw dies, aber warum Compiler kann das nicht tun? –

+7

Warum * sollte * eine außerhalb des Geltungsbereichs liegende Variable außerhalb ihres Gültigkeitsbereichs verwendbar sein? Es wäre ein Fehler, wenn Sie dies tun könnten –

Antwort

17

Ihre Variablen sind außerhalb der do/while verwendet (die curlies typischerweise in C# den Umfang definieren), und da es im Innern der do-while deklariert wird, können Sie es nicht außerhalb dieses Bereichs verwendet werden.

Sie können dies beheben, indem Sie es einfach außerhalb der Schleife deklarieren.

int composite = 0; // you are not required to set it to zero, as long 
        // as you do not use it before you initialize it 
do 
{ 
    index += index; 
    composite = index + 1; 
    // more code here 
} while (UnsetBitmask(bitmasks, composite)); 

Anmerkung (1), ist es üblich, zu erklären und eine Variable in einem Rutsch gesetzt, aber dies ist nicht erforderlich, solange Sie es einstellen, bevor Sie es benutzen.

Hinweis (2): in C#, geschweifte Klammern {....} den Umfang der Variablen definieren. Sie können eine Variable nicht außerhalb ihres Gültigkeitsbereichs verwenden, sie ist nicht mehr "sichtbar", tatsächlich ist sie, sobald sie den Gültigkeitsbereich verlässt, bereit für die Sammlung von Datenmüll und ihr Inhalt kann undefiniert sein.


ich dieses konw, aber warum Compiler diese Sie

cant do dies in den Kommentaren gefragt. Die Antwort ist weniger trivial als es scheinen mag. Es hängt stark von der Sprachdefinition ab. Einige Sprachen, wie Perl oder ältere BASIC, ermöglichen Variablen auf jeder Ebene und in jedem Bereich deklariert werden. Andere Sprachen erlauben das Scoping von Variablen und erfordern, dass Variablen vor ihrer Verwendung deklariert werden (C#, Java, C++, Python). Normalerweise, aber nicht notwendigerweise, ist dies für statically typed languages üblich, da der Compiler im Voraus wissen muss, welche Art von Daten Sie in die Variable eingeben möchten, um die Überprüfung des Typs durchzuführen.

Wenn ein Compiler die Deklaration, aber nicht den Geltungsbereich erzwingt, bedeutet dies, dass alle Variablen global sind, was in größeren Programmen schwierig ist. Wie bei einem Programmierer müssen Sie beibehalten, wo Sie welche Variablennamen verwendet haben und die Eindeutigkeit beibehalten . Das ist sehr mühsam (denke COBOL).

C# hinzugefügt das dynamic Schlüsselwort, das für Variablen mit dynamischen Typ ermöglicht, aber dies erfordert immer noch Sie die Variable vor der Verwendung zu definieren.

Ein Compiler kann dies tun, aber die Designer von C# haben entschieden, dass eine klare Sprache ist besser, und ihrer Meinung nach deklarierten Variablen are a good thing, weil es falsche Fehler und unmöglich befolgende Code verhindert:

// can you see the problem? 
va1l = 1; 
val1 = 2; 
vall = va1l + vall; 

Die Erzwingung von Variablen zu deklarieren und diese zu begrenzen, verhindert diese und ähnliche Fehler.

+0

Ich denke, Sie meinen, es ist "innerhalb" der Do/While. – juharr

+0

@juharr, danke, aber nein, ich meinte es ist _used_ außerhalb seines Geltungsbereiches. Ich werde bearbeiten. – Abel

+0

In diesem Fall müssen Sie die Variable "composite" vor der Schleife nicht auf Null initialisieren. –

7

Dies ist kein Fehler. Die Bedingung innerhalb der while-Schleife befindet sich außerhalb des Blocks, in dem die Variable definiert ist.

int composite; 
do 
{ 
    index += index; 
    composite = index + 1; 
    // more code here 
} while (UnsetBitmask(bitmasks, composite)); 
2

der Umfang dieser Variablen ist nur innerhalb der Schleife .... Sie können es nicht außerhalb der Schleife verwenden

Sie sollten etwas tun ....

int composite; 
do 
{ 
    index += index; 
    composite = index + 1; 
    // more code here 
} while (UnsetBitmask(bitmasks, composite)); 
2

Während { ... } ein Mittel Codeblock alle Variablen innerhalb dieses Blocks sind auf diesen speziellen Bereich beschränkt. Ihre Bedingung liegt außerhalb dieses Bereichs, sodass sie dort nicht auf die Variable zugreifen kann. Erklären Sie es außerhalb der Schleife und es funktioniert:

int composite = 0; 
do 
{ 
    index += index; 
    composite += index + 1; 
    // more code here 
} while (UnsetBitmask(bitmasks, composite)); 
2

Per Specification die Bedingungsvariablen für do .. while sollten die Variable in jeder Iteration außerhalb der Schleife sonst erklärt werden, bekommen neu initialisiert, die nicht sinnvoll sind.

 int composite; 
     do 
     { 
      index += index; 
      composite = index + 1; 
      // more code here 
     } while (UnsetBitmask(bitmasks, composite)); 
2

Mehr Regel: Sie kann nicht Verwendung Variable außerhalb seines Umfang, dass es {...} in C# ist, z.B.

{ 
    int x = 123; 
    ... 
    } 
    x = 456; // <- compile time error 

do {} while im Code bedeutet nur, dass der Umfang der Schleife gehört.

0
int composite; 
do 
{ 
    index += index; 
    composite = index + 1; 
    // more code here 
} while (UnsetBitmask(bitmasks, composite)); 
+0

nach dem Format von do ehile Deklaration der Variablen muss vor dem Start der Schleife – codemaster

+1

Sie können Ihre Antwort bearbeiten, um Informationen hinzuzufügen (oder korrigieren), anstatt einen Kommentar hinzuzufügen. Die Bearbeitung Ihrer Antwort ist vorzuziehen, da sie es anderen erleichtert, die Informationen später zu finden und zu lesen. – dsh

Verwandte Themen