Anweisungblock nach der Deklaration einer Variable???

Hallo,

nun lese ich mir grad ein Buch durch (C von A bis Z) und da habe ich bemerkt, dass nach der Deklaration einer Variable Anweisungblöcke kommen. Hier mal das Beispiel:
Code:
#include <stdio.h>
 
int main(void) 
{
         int i=333;
 
         if (i == 333) 
         {

              int i = 666;     /* <------- */
              {
                   i = 111;
                   printf("%d\n",i);   /* 111 */
              }

               printf("%d\n",i);      /* 111 */
         }

         printf("%d\n",i);         /* 333 */
 
         system("PAUSE");
         return 0;
}

Darf man das machen, und wenn ja, wie lautet die Regel?
 
das darf man machen, soll dir hier aber nu verdeutlichen, wie das mit den lokalen variablen aussieht ;)
mehr sinn ist da kaum vorhanden, mir is zumindest noch kaum nen moment untergekommen, wo man das braucht.

ggf. um mit variablen kurz einen zwischenschritt einzulegen, aber ohne die variablen hinterher verändert zu haben oder sowas.
 
Das Beispiel 'smells like hell'.

Das wäre ein Beispiel wie man lokale Variablen auf keinen Fall verwenden sollte. Denn dass man Ende wieder 333 in i gespeichert ist, würde man auf den schnellen Blick nicht erwarten.

Deswegen sollte man Variablen innerhalb einer Methode in einem Unterblock nicht neu deklarieren, wie es dort der Fall ist. Am Ende wundert man sich nämlich dann über merkwürdiges Fehlverhalten der Methode
 
Das Beispiel 'smells like hell'.
Eher *C smells like hell* *scnr*
Habe mir gerade das Beispiel nochmal angeschaut:
Das sollte eigentlich den Gültigkeitsbereich der Variablen verdeutlichen
C von A bis Z hat gesagt.:
Hier folgt nochmals ein Beispiel, das aber keine Schule machen sollte:
...
Für lokale Variablen gilt Folgendes: Bei gleichnamigen Variablen ist immer die lokalste Variable gültig, also die, die dem Anweisungsblock am nächsten steht.
und erfüllt damit wurnderbar seinen Zweck ;)
 
mehr sinn ist da kaum vorhanden, mir is zumindest noch kaum nen moment untergekommen, wo man das braucht.

In C++ macht sowas beizeiten Sinn
Code:
void Object::func()
{
    /* do stuff which doesn't need synchronisation */

    {
         LockObject lock(semaphore);
         /* do stuff which needs synchronisation */
    }

    /* do stuff which doesn't need synchronisation */
}
So kann man critical sections möglichst klein halten, da das Objekt bei Ende des Anweisungsblocks zerstört wird.

mfg benediktibk
 
Zurück
Oben