Есть ли объяснение того, как работает область действия переменной? - PullRequest
0 голосов
/ 28 марта 2020
#include<stdio.h>
#include<stdlib.h>


int main(){

    int a=1, b=2, c=3;
    printf("%d %d %d\n", a,b,c );    //1 2 3

    {
        int b=4;
        float c=5.0;

        printf("%d %d %.1f\n", a,b,c);      // 1 4 5.0
        a=b;
        {
            int c;
            c=b;
            printf("%d %d %d\n", a,b,c);        // 4 4 4
        }

         printf("%d %d %.1f\n", a,b,c);        // 4 4 5.0
    }

     printf("%d %d %d\n", a,b,c);              // 4 2 3
}

В этом коде для последнего оператора printf почему значение переменной a отображается как 4 в программе, даже если значение a было объявлено как 1 в этой области? Я имею в виду, я понимаю, что это значение было назначено равным b, но это утверждение во внутреннем блоке операторов. Более того, даже c было присвоено значение b в одном из внутренних блоков, но оно все еще сохраняет свое значение 3, объявленное во внешнем блоке этого кода.

1 Ответ

1 голос
/ 28 марта 2020

Ваш код эквивалентен следующему:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int a1 = 1, b1 = 2, c1 = 3;
    printf("%d %d %d\n", a1, b1, c1);  // 1 2 3
    {
        int b2 = 4;
        float c2 = 5.0;
        printf("%d %d %.1f\n", a1, b2, c2);  // 1 4 5.0
        a1 = b2;
        {
            int c3;
            c3 = b2;
            printf("%d %d %d\n", a1, b2, c3);  // 4 4 4
        }
        printf("%d %d %.1f\n", a1, b2, c2);  // 4 4 5.0
    }
    printf("%d %d %d\n", a1, b1, c1);  // 4 2 3
}

Если переменная объявлена ​​ внутри области, что означает, что она имеет тип, такой как int a = 5, тогда переменная во внешней области с тем же именем затеняется и больше не будет использоваться или затрагиваться во внутренней области. Однако если переменная назначена внутри области, что означает, что ей не хватает типа, подобного a = 5, и переменная не была объявлена ​​внутри области, то переменная вне области будет изменена. Вы также можете найти полезную статью здесь .

...