- Когда вы говорите
fn()
, он вызовет функцию
- Когда вы говорите
fn
, это относится к адресу функции, в которую должен быть сделан вызов
Таким образом, printf("%d\n\n",fn);
напечатает адрес адреса функции, фактически не случайного числа, а printf("%d\n\n", fn());
вызовет функцию и выведет то, что было возвращено.
Обратите внимание на разницу:
int fn (void)
{
return 10;
}
int main (void)
{
int x, y;
x = fn();
y = fn;
}
Вот вывод компилятора:
fn:
push ebp
mov ebp, esp
mov eax, 10
pop ebp
ret
.size fn, .-fn
.globl main
.type main, @function
main:
lea ecx, [esp+4]
and esp, -16
push DWORD PTR [ecx-4]
push ebp
mov ebp, esp
push ecx
sub esp, 20
; below code does x=fn();
call fn ; calls fn, return value in eax
mov DWORD PTR [ebp-12], eax ; stores eax in ebp-12, the location for x on the local stack allocated by compiler
; below code does x=fn;
mov DWORD PTR [ebp-8], OFFSET FLAT:fn ; stores the label address in ebp-8, the location for y on local stack allocated by compiler
add esp, 20
pop ecx
pop ebp
lea esp, [ecx-4]
ret