Внешние (глобальные) переменные в C - PullRequest
0 голосов
/ 05 февраля 2020

Я читаю C книгу программирования, C Язык программирования (K & R, 2nd Edition) . Я узнал факты о внешних переменных в книге, но обнаружил нечто иное, когда сам применил принципы. Книга гласит:

"... поскольку внешние переменные существуют постоянно, а не появляются и исчезают при вызове и выходе из функций, они сохраняют свои значения даже после тех функций, которые установлены они вернулись. "

Однако, когда я кодирую так:

#include <stdio.h>

int i = 0;
void foo();

main()
{
    foo();                  
    printf("%d", i);
    return 0;
}

void foo()
{
    i = 1;
}

Программа выводит 1 вместо 0, что является исходным значением внешней переменной i. Поэтому мне интересно, где я получаю ошибки, думая о принципе и как его понять.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2020

... они сохраняют свои значения даже после того, как функции, которые их устанавливают, возвращаются.

Я предполагаю, что это вопрос интерпретации с вашей стороны.

Учитывая, что переменная является глобальной, при каждом ее изменении в любой функции она будет принимать и сохранять это значение до следующего изменения.

Взять функцию:

int i = 0;
void foo();

int main()
{
    int x = 0;
    foo(x);                  
    printf("%d", i);
    printf("%d", x);
    return 0;
}

void foo(int x)
{
    x = 1;
    i = 1;
}

результат: x = 0 i = 1

x передается по значению, по сути, его копии, поэтому, как только функция выходит из области видимости, т.е. возвращается, копия отбрасывается. i является глобальным, поэтому вам даже не нужно его передавать; каждая функция осознает свое существование и изменит свое значение.

2 голосов
/ 05 февраля 2020

В противоположность тому, что вы думаете, эта фраза

... при вызове и выходе из функции они сохраняют свои значения даже после того, как функции, которые их устанавливают, возвращают

означает, что после выхода из функции переменные с внешней связью сохраняют значение, присвоенное ей в функции. И ваша программа демонстрирует это.

Обратите внимание, что теперь согласно C стандарту функция main без параметров должна быть объявлена ​​как

int main( void )

Тип по умолчанию int отсутствует функции, хотя некоторые компиляторы сохраняют обратную совместимость.

...