int fn()
{
return 10;
}
int main()
{
printf("%d\n\n",fn);
system("pause");
}
该程序给出一个随机数,但是当进行函数调用时,它返回值10。
我可以得出结论,当我们在printf语句中使用函数名时,它会给出一个垃圾值或者还有其他一些概念吗?
由于
答案 0 :(得分:6)
应该是:
printf("%d\n\n",fn());
fn
对应于函数的指针地址。这就是你得到垃圾号码的原因。
要调用函数,必须使用如下括号:
foo();
foo(parameter1, ..., parameterN);
答案 1 :(得分:3)
您正在内存中打印fn代码的实际地址,而不是调用它。打电话给你,你的生活将会启发!
printf("%d\n\n", fn());
请在逗号之后加上一个空格,就像往常一样。
答案 2 :(得分:2)
忘记调用该函数:)
将fn
更改为fn()
printf("%d\n\n", fn());
现在这是你用省略号得到的 - 没有类型检查......
答案 3 :(得分:2)
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
答案 4 :(得分:1)
fn()不是fn
printf("%d\n\n",fn());
答案 5 :(得分:1)
当你输入fn()时,你没有调用这个函数。这就是你调用函数时应该给你正确的结果。(见下文)
int fn()
{
return 10;
}
int main()
{
printf("%d\n\n" , fn() );
system("pause");
}
答案 6 :(得分:-1)
您应该将printf()语句更改为此
printf(“%d \ n”,fn());
现在,这样可以正常工作。