gpt4 book ai didi

c - 在 C 中,如果未明确编写,被调用函数是否会自动返回其被调用函数返回的值?

转载 作者:太空宇宙 更新时间:2023-11-04 05:58:37 25 4
gpt4 key购买 nike

我有如下代码。函数 slogan 总是返回 printf 返回的值,即打印的字符数。是否按照 C 编译器定义?完全回归机制的隐含概念是什么?

#include <stdio.h>

int main()
{
int slogan( ) ;
int c = 5 ;
c = slogan( ) ;
printf ( "\n%d", c ) ;
}

int slogan( )
{
printf ( "\nOnly He men use C!" ) ;
}

最佳答案

这是 undefined behavior要在结束值返回函数的末尾时使用返回值,您不能依赖此行为。

这在 C99 标准草案 6.9.1 Function definitions paragraph 12 中有介绍,它说:

If the } that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined.

与C11标准草案中相同的章节和段落。

在您的情况下,它只能靠运气工作,可能返回值在您返回时未被覆盖的寄存器中返回。对于 System V calling convention将在 eax/rax 中返回一个足够小的参数,如果我们看一下经过轻微修改的测试程序 live on Coliru using gcc使用 -fverbose-asm 标志:

#include <stdio.h>

int main()
{
int slogan( ) ;
int c = 5, d ;
c = slogan( ) ;
d = printf ( "\n%d", c ) ;
printf ( "\n%d", d ) ;
}

int slogan( )
{
printf ( "\nOnly He men use C!" ) ;
}

从程序集可以看出,cd都是从eax中获取值的:

movl    %eax, -4(%rbp)  # tmp61, c
movl -4(%rbp), %eax # c, tmp62
movl %eax, %esi # tmp62,
movl $.LC0, %edi
movl $0, %eax
call printf
movl %eax, -8(%rbp) # tmp63, d
movl -8(%rbp), %eax # d, tmp64
movl %eax, %esi # tmp64,
movl $.LC0, %edi
movl $0, %eax
call printf

关于c - 在 C 中,如果未明确编写,被调用函数是否会自动返回其被调用函数返回的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22760839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com