我有一个面试问题,面试官问我从下面的输出中得到什么错误:
int main()
{
printf("hello world");
return 0;
}
#include <stdio.h>
我回答“没有错误”,它会显示输出。
任何人都可以帮我这个吗?
请注意“缺少的尖括号是我故意做的,所以不要为此烦恼”
答案 0 :(得分:7)
这取决于编译器。
大多数C编译器可能接受该代码(可能带有警告)并生成可执行文件以打印预期的输出。
根据C90规则,printf
调用的行为未定义;调用没有可见原型的可变参数函数是无效的。变量函数可以具有与普通函数不同的调用约定,并且您必须让编译器知道printf
是可变参数,因此它可以为调用生成正确的代码。
在C99及更高版本的规则下,调用任何没有可见声明的函数(可能是也可能不是原型)都是约束违规,至少需要编译时警告。
如果你在没有所需原型的情况下调用printf
,标准并没有暗示会发生什么,但实际上大多数编译器都会正确地处理它#34; <#p>;
输出末尾缺少'\n'
意味着程序的行为未定义如果实现需要输出结尾的换行符;这是否需要是实现定义的。无论如何,添加换行符是一个好主意。
源文件末尾的#include <stdio.h>
应该没用,但无害。
我假设源文件实际上包含#include <stdio.h>
而不是#include stdio.h
;后者将是语法错误。
(实际上,当然,#include <stdio.h>
应该位于顶部。在专业设置中,输出无关紧要,因为程序永远不会在代码审查中存活下来。)
答案 1 :(得分:1)
<>
的文件名中缺少引号或#include
会出错。它应该是:
#include <stdio.h>
除此之外,它应该编译一个关于printf()
的隐式声明的警告。在Clang上,它给了我:
test.c:3:5: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)'
printf("hello world");
^
答案 2 :(得分:0)
当你的main()
函数被声明时,编译器会遇到main()
的第一行,它不知道printf()
是什么。您将收到有关编译器抱怨未声明函数的错误。
当然,假设您在复制问题时引入了错误的<
和>
错误。
答案 3 :(得分:0)
这里有两个错误。第一个是include指令必须在需要头信息的代码之前发生,在这种情况下printf()在stdio.h中声明,第二个是include指令中的文件名必须用尖括号括起来,&lt ;&gt;,或引号,&#34;&#34;。