Может ли функция вернуть значение, которое в ней инициализировано? - PullRequest
2 голосов
/ 14 февраля 2020

Мне действительно интересно, почему вывод: 12 вместо 9 в следующем коде:

#include <stdio.h>

int a = 4, b = 2;
int c = 3;
int f(void);

int main(void) {
    printf("%3d\n", f());
    printf("%3d%3d%3d\n", a, b, c);
    return 0;
}

int f(void) {
    int b, c;
    a = b = c = 4;
    return (a + b + c);
}

Я имею в виду, поскольку b и c локальные переменные инициализированы как в функции f, когда функция вернулась, они больше не существуют поэтому они не должны быть возвращены. Кто-нибудь может объяснить?

int k(void) {
    int d = 5;
return d;
}

Как функция k ничего не возвращает, верно?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Вы сделали функцию f, возвращающую суммирование "значений" a, b и c, а не самих переменных. Объявляя переменные с именами b и c в функции f, глобальные переменные b и c скрываются локальными переменными, поэтому любые изменения (например, присвоение 4, как вы сделали) не влияют на глобальные переменные с такими же именами.

0 голосов
/ 14 февраля 2020

Вам кажется, что f возвращает не одно значение, а все выражение a + b + c, и это выражение вычисляется в вызывающей функции. Это не то, что происходит.

Внутри функции f глобальный a установлен на 4, как и локальные b и c. Значения каждого из них складываются вместе, что приводит к значению 12, и это значение является тем, что возвращается из функции.

Выражения вычисляются в точке их появления.

...