#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()中没有“ return”。并使用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
在%eax寄存器中进行32的减法。在x86调用约定中,这是期望返回值的寄存器!所以…你很幸运。
但是请 注意警告。 他们在那里是有原因的!