首页 > Linux专区, 编程 > 你精通C语言吗?–由一次面试的亲身体会想到的…

你精通C语言吗?–由一次面试的亲身体会想到的…

2010年10月13日 发表评论 阅读评论

 

读研这两年,平时项目都在用C语言在Linux下做,两年下来,也写了不少的代码,再加上我平时的不懈努力,多看书,也算是C语言的基础知识比较扎实了,因此在自己的简历上,就写上了“精通C语言编程”;这个在面试华为、中兴以及华赛的时候,都还好,问的问题都没有被卡壳,但是就在前几天,我去成都面试某互联网公司的时候,就结结实实的被打击了一下:当时面试管GG 看到我简历上写的“精通C语言编程”,就说:你精通C语言编程啊?我当时就一个汗啊!GG又说:那好吧!我给你说个最简单的吧:

struct empty{ }a ; //sizeof(a)

我只记得 在C++里面 空class 是 1;但是 在C语言的标准下,就不太好说了4? 1? 0? ,我一时之间想不到为什么了,这样的东西和编译器有关系?

当时大脑飞速运转,思考很多知识,总结推理…

回答:C++的标准下是1,C语言里面不确定,但是我推测是0或者4,原因:….

面试官GG 笑而不语。

我晓得自己回答的,他肯定不太满意。

然后GG接着问:问什么在C++中是1呢?

汗!这次是真的回答不上来了,由此想到自己还是真的不能堪称“精通C”啊!

回来以后,在VC下试了一下 结果是1,GCC下试了一下是0;

看来这个问题和编译器有关系啊!

再想一下,不免可以有一个比较清楚的认识了:每个结构体,编译器在处理的时候,都要对他进行识别,空的结构体就不能用结构体内部来识别他,就要编译器帮忙,这样的话,VC就产生了一个字节的空间来存储结构体的标识。GCC在处理的过程中节省了空间,但是他是怎么识别的呢?呵呵,回头想一下,其实两个空的结构体是没有用的,识别与否关系不太大!

由这个题目,我还想起来一个知识点:

#define print( n ) printf( “data”#n” = %d\n “, data##n )
int main()
{
      int data5=100;
      print(5);
      return 0;
}

上面这个代码是多少呢?有没有思考过呢?平时做项目的时候有没有用到过呢?

呵呵,如果我告诉你 结果是 :data5=100;
你会不会有些惊讶?

为什么是这样的呢?我们要从#号的功能谈起了
# 本身为指令 没有其他意义,也没有其他效果
# 号必须是该行除了任何空白字符外的第一个字符。预处理指令就是以#号开头的代码行。
# 后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。
整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。

下面举例说明下:
形式为: #define 标识符 字符串.
其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。 #x中的#是字符串化运算符,作为是把参数x字符串化,即用双引号包围,例如,在这个程序中:

print(4);

参数4经过宏替换并字符串化之后,就成了:

printf(“the no. ” “4″ “,is”);

由于相邻的字符串会自动被连接,所以,它最终相当于:

printf(“the no. 4 ,is”);

由此 我们可以在 gcc 下试一下:

[root@localhost ~]# gcc -E –o test test.c
[root@localhost ~]# cat test
# 1 “test1.c”
# 1 “<built-in>”
# 1 “<command line>”
# 1 “test1.c”

int main()
{
      int data5=100;
      printf( “data ” “5″” = %d\n “, data5 );
      return 0;
}

这下就比较清楚了吧!

呵呵,其实C语言几十年不衰,还是有原因的,他有很经典的地方。很值得我们深入的研究它!

分类: Linux专区, 编程 标签:
  1. 2010年10月15日14:14 | #1

    呵呵,宏是比较复杂。
    我都不敢写精通某种语言的。

    ps:
    一个宏的有趣问题,不用循环和递归,写出打印1,2,。。。1000的程序。

  2. 邯郸
    2010年10月20日09:41 | #2

    正在学,太深奥了

  3. 2010年10月20日11:57 | #3

    深奥 ,深奥

  4. 2010年10月21日15:55 | #4

    [1]
    # 号必须是该行除了任何空白字符外的第一个字符。
    ——
    前面也可以添加注释啊
    [2]
    一个宏的有趣问题,不用循环和递归,写出打印1,2,。。。1000的程序。
    ——
    用枚举变量?

  5. 小卢
    2010年10月21日21:18 | #5

    @wcdj
    呵呵,预编译过程,注释省略的吗
    不过你的思维 很严密哈,记得陈正冲讲到这个对吧?哈哈

    第二个问题,我还在想,你说的是个方法,不过枚举1000个,这写代码也太累了吧?哈哈

  6. 小卢
    2010年10月21日21:23 | #6

    @wcdj

    @moorekang

    我道是 想到一个 可以用递归解决的方法,哈哈,不过,刚刚看到说的不让用递归。。。 (┬_┬)

  7. 小卢
    2010年10月21日21:35 | #7

    哈哈,怪我啦!
    我去百度了下:

    看了以后,恍然大悟:

    #include
    #define A(x) x;x;x;x;x;x;x;x;x;x;
    int main (void)
    {
    int n = 1;
    //下面完成三次宏调用,每次宏调用,实现10个展开函数,正好出现1000次展开(1000个printf(…)),
    //感觉还是非常巧妙 –yqshare

    A(A(A(printf (“%d “, n++))));
    return 0;

  8. 2010年11月1日15:29 | #8

    博大精深的C啊

  9. phenix
    2010年11月15日14:04 | #9

    你好,能否知道你的联系方式? 我现在在linux下使用c语言, 一直碰壁,也没有一个 可以帮我的人
    谢谢~!

  10. 小卢
    2010年11月15日16:04 | #10

    @phenix
    我邮箱,咱们可以共同讨论下:

    $echo -n “Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGx1eXVxaW1haWxib3hAZ21haWwuY29tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo=” | base64 -d

  11. 2010年12月4日21:53 | #11

    博主博客设计的真不错,精品游戏网我的网站,博主也给点建议吧?

  12. bear
    2011年1月13日11:57 | #12

    精辟!!!

  13. 2011年4月18日19:38 | #13

    研究一下。

  14. 匿名
    2011年5月9日19:05 | #14

    闲暇之余,恍惚之间,一不小心,在看其他东西的时候,发现了这个网中花园。博主是个细心之人,不管是做博客还是其它的。看来以后这是个久留之地了,希望博主能再接再厉。 师弟:fxp

  15. 小卢
    2011年5月10日09:47 | #15

    我勒个去,不带这样说的,哥会不好意思滴

  16. 匿名
    2011年5月24日23:16 | #16

    师兄v5!!!

  17. 2011年10月17日17:08 | #17

    上述SelectChina.com ,并寻找中国五金工具制造商/中国五金工具产品的更多信息。 u003c! – INFOLINKS_OFF – u003e

    heavy equipment parts inc
    used truck trailers
    komatsu pc 35 mr
    safety heavy equipment
    heavy equipment training courses

    Demag cc 2400

    Heavy equipment training school

    Komatsu wa250-1

    Excavator sale

    Hitachi zw 310

    Heavy trucks for sale

    Nccco certification

    Salvage heavy trucks

    Sale machinery

    Caterpillar 299c for sale

  18. 2012年3月26日08:25 | #18

    @小卢

    A(A(A(printf (“%d “, n++))));

    LZ,这不是递归是什么?

  1. 本文目前尚无任何 trackbacks 和 pingbacks.