Как узнать, когда функция обращается к локальной или внешней переменной? - PullRequest
0 голосов
/ 04 июня 2019

Я сейчас пытаюсь понять этот код, я наткнулся на сертификационный тест на Си.Правильный вывод кода - 12, 13, 13. Я попытался распечатать значения, прежде чем он вызовет 3 конечных вывода, и я заметил, что причина в том, что существует разница в области видимости между внешним x, объявленным сверху и однимвнутри функции.Мой вопрос: как мне узнать, какие из этих функций обращаются к какому объекту в коде?

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

int x; 
int modifyvalue() 
{ 
    return(x+=10); 
}
int changevalue(int x) 
{ 
    return(x+=1); 
}


int main(){
    int x=10; 
    x++; 
    printf("[1] %d \n\n", x);  
    changevalue(x); 
    printf("[2] %d \n\n", x);
    x++;
    printf("[3] %d \n\n", x); 
    modifyvalue(); 
    printf("First output:%d \n\n\n",x);
    x++; 
    changevalue(x); 
    printf("Second output:%d \n\n\n",x); 
    modifyvalue(); 
    printf("Third output:%dn \n\n\n",x);
}

Ответы [ 2 ]

4 голосов
/ 04 июня 2019

Всегда берите переменную из ближайшей области видимости.
Всякий раз, когда вызывается printf("...", x), он берет x из функции main().

Функция modifyvalue() всегда действует на x вне всех функций.

Функция changevalue(int x) всегда работает с параметром x, который является копией переданной переменной.

Так что в вашем случае обе функции по существу ничего не делают с x в main().

2 голосов
/ 04 июня 2019

Правило простое, в каждом {...} (блоке) вы можете ссылаться либо на переменную, которая определена в этом блоке, либо на любой его «родитель».Например, в вашем коде:

  • modifyvalue: нет x, x в родительском, "global"
  • changevalue: x является параметром, приращение параметр , изменение не отражается на вызывающем абоненте (поскольку параметр является копией)
  • main: x является локальным

Обратите внимание, что вы всегда печатаете «главный x», который только увеличиваетсяв основном.Как отмечает @Jens, родительская область в C называется включающим блоком, а глобальная область называется областью программы (область файла + внешняя)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...