你精通C语言吗?–由一次面试的亲身体会想到的…
读研这两年,平时项目都在用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语言几十年不衰,还是有原因的,他有很经典的地方。很值得我们深入的研究它!
呵呵,宏是比较复杂。
我都不敢写精通某种语言的。
ps:
一个宏的有趣问题,不用循环和递归,写出打印1,2,。。。1000的程序。
正在学,太深奥了
深奥 ,深奥
[1]
# 号必须是该行除了任何空白字符外的第一个字符。
——
前面也可以添加注释啊
[2]
一个宏的有趣问题,不用循环和递归,写出打印1,2,。。。1000的程序。
——
用枚举变量?
@wcdj
呵呵,预编译过程,注释省略的吗
不过你的思维 很严密哈,记得陈正冲讲到这个对吧?哈哈
第二个问题,我还在想,你说的是个方法,不过枚举1000个,这写代码也太累了吧?哈哈
@wcdj
@moorekang
我道是 想到一个 可以用递归解决的方法,哈哈,不过,刚刚看到说的不让用递归。。。 (┬_┬)
哈哈,怪我啦!
我去百度了下:
看了以后,恍然大悟:
#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;
}
博大精深的C啊
你好,能否知道你的联系方式? 我现在在linux下使用c语言, 一直碰壁,也没有一个 可以帮我的人
谢谢~!
@phenix
我邮箱,咱们可以共同讨论下:
$echo -n “Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGx1eXVxaW1haWxib3hAZ21haWwuY29tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo=” | base64 -d
博主博客设计的真不错,精品游戏网我的网站,博主也给点建议吧?
精辟!!!
研究一下。
闲暇之余,恍惚之间,一不小心,在看其他东西的时候,发现了这个网中花园。博主是个细心之人,不管是做博客还是其它的。看来以后这是个久留之地了,希望博主能再接再厉。 师弟:fxp
我勒个去,不带这样说的,哥会不好意思滴
师兄v5!!!
上述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
@小卢
A(A(A(printf (“%d “, n++))));
LZ,这不是递归是什么?