gpt4 book ai didi

c - GCC 为什么以及如何编译缺少 return 语句的函数?

转载 作者:行者123 更新时间:2023-11-30 16:38:00 25 4
gpt4 key购买 nike

考虑:

#include <stdio.h>

char toUpper(char);

int main(void)
{
char ch, ch2;
printf("lowercase input: ");
ch = getchar();
ch2 = toUpper(ch);
printf("%c ==> %c\n", ch, ch2);

return 0;
}

char toUpper(char c)
{
if(c>='a' && c<='z')
c = c - 32;
}

toUpper函数中,返回类型是char,但是toUpper()中没有任何“返回”。并用gcc(GCC)4.5.1 20100924(Red Hat 4.5.1-4)编译源代码,Fedora 14.

当然,会发出警告:“警告:控制到达非空函数的末尾”,但是,运行良好。

使用 gcc 编译期间该代码发生了什么?

最佳答案

当 C 程序被编译成汇编语言时,你的 toUpper 函数最终可能是这样的:

_toUpper:
LFB4:
pushq %rbp
LCFI3:
movq %rsp, %rbp
LCFI4:
movb %dil, -4(%rbp)
cmpb $96, -4(%rbp)
jle L8
cmpb $122, -4(%rbp)
jg L8
movzbl -4(%rbp), %eax
subl $32, %eax
movb %al, -4(%rbp)
L8:
leave
ret

32 的减法是在 %eax 寄存器中进行的。在 x86 调用约定中,这就是预期返回值所在的寄存器!所以...你很幸运。

但是请注意警告。它们的存在是有原因的!

关于c - GCC 为什么以及如何编译缺少 return 语句的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47649035/

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