【转】你精通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) 编辑 收藏 举报