【转】你精通C语言吗?

强大的宏不需解释,后半部分更精彩。

另附:不用循环打印1——1000

 

1 #include
2 #define A(x) x;x;x;x;x;x;x;x;x;x;
3 int main (void)
4 {
5   int n = 1;
6 
7   A(A(A(printf ("%d", n++))));
8   return 0;
9 }

 

 

FROM:http://www.yqshare.com/use-in-the-c.html

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

1 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在处理的过程中节省了空间,但是他是怎么识别的呢?呵呵,回头想一下,其实两个空的结构体是没有用的,识别与否关系不太大!

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

 

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

 

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

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

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

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

1 print(4);

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

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

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

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

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

 

 1 [root@localhost ~]# gcc -E –o test test.c
 2 [root@localhost ~]# cat test
 3 # 1 “test1.c”
 4 # 1 “<built-in> 5 # 1 “<command line> 6 # 1 “test1.c”
 7 
 8 int main()
 9 {
10   int data5=100;
11   printf( “data ” “5″” = %d\n “, data5 );
12   return 0;
13 }

 

这下就比较清楚了吧!

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



posted on 2012-03-10 17:08  William.Wu  阅读(323)  评论(0编辑  收藏  举报

导航