按:
此篇无甚营养,读者自决去意。
前天晚上信了联场的邪。。系统自带电脑管家推送让我更新驱动,脑子一短路就全更了。包括无线和有线两个网卡驱动。昨天早上开机,发现连不上网。追悔莫及,又信了客服的邪,瞎胡乱搞折腾一上午才让我卸驱动重装。于是乎,卸装卸装卸装。。一上午,未果。索性拿去找学长。诊断症状,决意重刷系统。忆当初无知,分区,文件放置多有不合理,近日正烦闷,此为良机。刷之,因SSD之故中途坎坷不止。终成。前后耗费近12小时。激活之,而后发现很多原厂自带功能亡。遂又百度之,客服问之。瞎胡乱搞之。前前后后,渐成瘾,迷之而不得自拔。又启新世界之门户。遂无心复习。所幸尚能悬崖勒马,不知祸福。按下不表,考完试可有得玩了,哈哈哈哈哈哈哈哈!!!!!
正题,考试还是得xue微准备一下是不是。。
题目一:
有关宏定义:
#define N 5
#define Y(n) ((N+1)*n)
则执行语句:
z=2*(N+Y(5+1))
后,变量z的值是?
正确答案:48
世间最大的悲哀不是被坑绊死,而是被绊死之后,还不知道坑在哪里。。
是不是当成在数学里那样,管他啥宏定义的,这不就是个函数表达式吗?
Y(5+1),不就是自变量是6么?
悲哀。。
这里Y()里面没有加括号,也就是说,带入之后是这个效果:
Y(5+1)==((3+1)*5+1)….
是不是小学生题?
你个傻子以后遇到宏定义干脆拿个纸写写吧。。
题二
这是一个被整得头大千千万次的坑:
设有语句:
char s[100]="a\01234\0x56b\0c";
int m=strlen(s);
则m的值是多少?
打脸,啪啪的:
就是4,你能怎么办?
char型数据一个1字节。
a后面不是确确实实是\0吗?
strlen()函数不是确实是读到最近一个空字符截止吗?
真相:
那个不是\0,是\012。再免费告诉你件事:
“转义字符是预先规定的,也就是说,其数量有限,格式规定,不是你想怎么来就怎么来的。”
跟你说这个,是因为,你不能因为12前面是0,就以为这是\12,你这样太任性了点。。
所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。
查个表就能看到:
\012 , 012是0开头的8进制数。换页。
那后面为啥不是\0x56b呢?这不16进制数吗?
因为没有这个表示,所以它只能是‘\0’。
于是,在执行strlen()函数时,这个字符串只有:
‘a’,‘\012’(非空字符啊,没毛病),‘3’,‘4’,‘\0’
综上,4不冤枉