考虑:
#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;
}
In the toUpper函数,返回类型为char,但没有任何“回报”到上层()。并用gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)编译源代码,Fedora https://en.wikipedia.org/wiki/Fedora_Linux 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 调用约定中,这就是预期返回值所在的寄存器!所以...你很幸运。
但是,求求您注意警告。他们在那里是有原因的!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)