Возврат и манипулирование возвращенными значениями в C - PullRequest
1 голос
/ 10 апреля 2011

Мне трудно понять, как C обрабатывает возвращаемые значения.Скажем, например, у нас есть:

int one = 0; 
one = foo(); // Why isn't one being assigned 10?
// Clearly there is a difference between these two
printf("%d", one); // one is still 0
printf("%d", foo());

int foo()
{   
 return 10; 
}

Я не могу объяснить, почему есть разница, и почему один не будет работать над другим.*

Ответы [ 3 ]

2 голосов
/ 10 апреля 2011

Вывод следующей программы 1010. Я скомпилировал его с gcc -Wall -std=c99 main.c -o main.exe Итак, я думаю, что это либо проблема вашего компилятора, либо вы ошиблись, когда заявили, что printf("%d", one); печатает ноль.

#include <stdio.h>

int foo(void);

int main()
{
    int one = 0; 
    one = foo();

    printf("%d", one);
    printf("%d", foo());

    return 0;
}

int foo()
{   
     return 10; 
}
2 голосов
/ 10 апреля 2011

Первый аргумент printf () - это const char *, (указатель на массив const char), а с printf(foo()) вы пытаетесь использовать указатель на адрес 10, который явно находится внедиапазон программы, в результате чего она не работает.Однако, с printf("%d", one) вы говорите printf распечатать число, которое работает.

1 голос
/ 10 апреля 2011

Функция C не является «функцией», как в математике (или как в функциональном программировании).

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

Так что подумайте над своим примером - что если foo () будет выглядеть так:


int foo()
{
 printf("some text");
 return 10; 
}

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

...