Chinaunix

标题: 一个网友问我的一道面试题.晕 [打印本页]

作者: www.netbor.net    时间: 2007-10-29 12:05
标题: 一个网友问我的一道面试题.晕
问题描述.
请回答如下关于精典的HELLO WORLD的问题.
代码如下:
A)
#include <stdio.h>
main()
{
      printf("hello world!\n");
}

B)
#include <stdio.h>
int main()
{
      printf("hello world!\n");
}

C)
#include <stdio.h>
int main(void)
{
      printf("hello world!\n");
      return 0;
}

D)
#include <stdio.h>
main(void)
{
      printf("hello world!\n");
      return 0;
}

1.分别指出如上代码是否有误,为什么?
2.请根据代码,介绍一下C语言的标准和规范.
3.为什么入口函数可以有这么多种写法?目的是什么?在什么时候可以用这种写法?为什么?哪一种写法最为规范,为什么?
......
后面还有我就不说了,看了会吐血的,谁来回答看看.
作者: xB1ue    时间: 2007-10-29 12:10
说个题外话
一个朋友当年读书的时候,中国的英语老师出的期末考试卷,单选题,是对一个常用语选择一个“正确”的表达方法,大部分学生们很快就做完了,我那个朋友没做出来,很郁闷,于是带着题目去问外教,外教在向他反复确认了几遍“这个的确是单选题吗?”后,无奈地说,这 4 种表达方法都是我们的常用说法。
作者: flw2    时间: 2007-10-29 12:14
函数的返回值老的函数声明可以没有,那么表示函数返回int
参数如果没有,那么表示参数是不一定的,不进行参数的类型检查
一个函数如果没有return返回值,返回值就是个随机的值,比如
int fun()
{
    ...
    printf...
}
返回很大可能就是printf的返回值,因为printf返回值就在eax中,然后eax作为fun的返回值
作者: cugb_cat    时间: 2007-10-29 12:21
以前的帖子讨论过很多这些情况
作者: cjaizss    时间: 2007-10-29 12:22
C语言标准中,main函数必须要是int main(void),或者int main(int,char**);
func(....)=int func(....)
作者: www.netbor.net    时间: 2007-10-29 12:41
说实在的,这个问题当时我想了半天,最后我说,我不知道如何向你解释,也许二楼的说得比较贴切一点吧,但如果换成你的中的一个去面试如何解释呢,总不能空在那里不做吧.
作者: dinghwy    时间: 2007-10-29 12:45
细节问题很多啊。
作者: xB1ue    时间: 2007-10-29 12:50
1.分别指出如上代码是否有误,为什么?
是否有误:无误。不同的编译器会有不同的表现。
为什么:给我个有误的理由

2.请根据代码,介绍一下C语言的标准和规范.
这些个代码没有体现出C89 和 C99 的区别与不同,无法根据其来总结C语言的标准与规范。

3.为什么入口函数可以有这么多种写法?目的是什么?在什么时候可以用这种写法?为什么?哪一种写法最为规范,为什么?
为什么入口函数可以有这么多种写法:C语言的最大魅力之一就是自由
目的是什么:做为入口函数
在什么时候可以用这种写法:写入口函数的时候
为什么:因为要编译通过
哪一种写法最为规范:没有通读过各编译器的具体实现,无法回答。
为什么:见上
作者: accelerator    时间: 2007-10-29 12:52
实际编译一下就知道了.

1. main的prototype, int main(void), int main(int argc, char *argv[])
2. 没有给出返回类型的函数返回值默认为int
3. 函数如果没有明确的return语句, 返回值为最后一条语句的值
作者: flw2    时间: 2007-10-29 12:53
#include <stdio.h>
//check return val in shell


int fun()
{
        extern int fun2(/*int*/);
        fun2(1,2,3,4);
        return 9;
}
int fun2(int i)
{
        return i;
}
int main(void)
{
        printf("%s","aaaaa");
        //fun();
}
作者: flw2    时间: 2007-10-29 12:56
1.分别指出如上代码是否有误,为什么?
是否有误:无误。不同的编译器会有不同的表现。
为什么:给我个有误的理由

是无错误,因为符合c标准,表现也就是警告而已

2.请根据代码,介绍一下C语言的标准和规范.
这些个代码没有体现出C89 和 C99 的区别与不同,无法根据其来总结C语言的标准与规范。

这个我也这么想,

3.为什么入口函数可以有这么多种写法?目的是什么?在什么时候可以用这种写法?为什么?哪一种写法最为规范,为什么?
为什么入口函数可以有这么多种写法:C语言的最大魅力之一就是自由//兼容性!公认的c++某些方面的改进是好的
目的是什么:做为入口函数
在什么时候可以用这种写法:写入口函数的时候
为什么:因为要编译通过
哪一种写法最为规范:没有通读过各编译器的具体实现,无法回答。
为什么:见上
作者: www.netbor.net    时间: 2007-10-29 14:50
楼上的回答真有意思,哈哈哈,难怪我不知道如何回答呢,回答不回答没什么意义。
作者: dxcnjupt    时间: 2007-10-29 15:29
在试卷上批评公司,不注重创新与实践,考这种没有意义的问题

如果公司能接受你的回答,就去面试;
如果公司不接受,就把公司炒了。这种公司不去也罢。

话说我们公司也考过类似的题目,要我写出8259A的寄存器格式....直接在试卷上开骂。
作者: www.netbor.net    时间: 2007-10-29 16:05

作者: flw2    时间: 2007-10-29 16:48
原帖由 www.netbor.net 于 2007-10-29 14:50 发表
楼上的回答真有意思,哈哈哈,难怪我不知道如何回答呢,回答不回答没什么意义。


你看我的帖子了没有?
作者: sesame0816    时间: 2007-10-29 18:00
不愧为大大,c89和c99的区别是什么都知道,我要去google下
作者: uindex    时间: 2007-10-29 18:42
C项是标准的
作者: JeffreyPei    时间: 2007-10-29 22:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: budognai    时间: 2007-10-30 17:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: tjpuj044    时间: 2007-10-30 22:32
何必呢 自己知道自己的那种写法能编出正确的程序出来就行了 反正用的时候只用一种
作者: ttvast    时间: 2007-10-30 23:28
很简单,为什么都不出错,
因为编译器其实不认识main这个函数的
除了早期的解释型c语言,现在我们看到的c语言编译器,都不会把main作为一个特殊的函数来处理。
main这个函数 只有在link 到 c runtime lib的时候才有意义。

所以这道题目靠的是连接器而不是编译器。
不过连接器对于题目上的那些情况都是管用的, 因为在连接器中本身不认识函数声明,也就是说c 的linker是不知道函数返回类型和参数情况的。
这就是为什么windows下的cdecl,stdcall,fastcall的函数l要有不同修饰名字来保证函数类型正确的匹配。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2