/* scope.c, Programm zum Studieren/Demonstrieren von "Scope"- oder
   "Sichtbarkeits"-Regeln */

#include <stdio.h>

int i = 200;
int test(int);

int main() {
  /*----------------------------main---------------------------------------------*/
  int i = 13;  /* Das globale i wird hier durch das lokale i "ueberschattet".    */

  printf("\n");
  printf("  i = %4d innerhalb von main\n\n", i);
  printf("      %4d Rueckgabe von test(1)\n\n", test(1));

  { /*---------eingeschlossene zusammengesetzte Anweisung------------------------*/
    int i;
    /* Wieder eine neue "Instanz" von i, sie ueberschattet die beiden aeusseren. */

    printf(" Jedoch:Innerhalb der eingeschlossenen zusammengesetzten Anweisung:\n");
    for (i=0; i < 3; i++) {
      printf("  i = %4d\n", i);
    }
  } /*---Ende der eingeschlossenen zusammengesetzten Anweisung--------------------*/
  printf("\n");
  printf("  i = %4d innerhalb von main und ausserhalb der eingeschlossenen\n\
                     zusammengesetzten Anweisung\n\n",i);

  printf("      %4d Rueckgabe von test(2) \n\n", test(2));
  /*--------------------------Ende von Main---------------------------------------*/
}

/*----------- Ab hier wieder Variablen ausserhalb von Main sichtbar --------------*/
int test(int a) {
  /* Diese Funktion inkrementiert den Wert von i aus der globalen Definition -----*/

  printf("  i = %4d innerhalb der Funktion test(%d)\n\n",i,a);

  i = i + 25;  /* Hier wird ein "Seiteneffekt" des Aufrufs von test() erzeugt ----*/

  return i;
}
