#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调用约定中,这是期望返回值的寄存器!所以…你很幸运。
但是请 注意警告。 他们在那里是有原因的!
此ProductDAO类返回用户的产品列表,但Netbeans中的编译器显示“Missing return statement”。有进展吗?
我遇到一种情况,一个non-void方法缺少一个return语句,而代码仍然在编译。我知道while循环之后的语句是不可达的(死代码),并且永远不会被执行。但是为什么编译器甚至不警告返回一些东西呢?或者为什么一种语言允许我们有一个非void的方法,它有一个无限循环,而不返回任何东西? 如果我在while循环中添加一个break语句(即使是一个条件语句),编译器就会抱怨那些臭名昭著的错误:在Ecli
我一直得到一个丢失的返回语句错误,但我不知道在哪里。每次跟随代码,我都感觉到至少有一个if语句提供了return语句。 代码:
我不断地得到缺少的return语句并且在解析时到达文件的结尾,然而我已经有了return语句并且我的代码正确地关闭了括号。请帮忙,谢谢
我有以下代码 null 我错过了什么?