180108—【复习】:两个典型题的自省。

按:

此篇无甚营养,读者自决去意。
前天晚上信了联场的邪。。系统自带电脑管家推送让我更新驱动,脑子一短路就全更了。包括无线和有线两个网卡驱动。昨天早上开机,发现连不上网。追悔莫及,又信了客服的邪,瞎胡乱搞折腾一上午才让我卸驱动重装。于是乎,卸装卸装卸装。。一上午,未果。索性拿去找学长。诊断症状,决意重刷系统。忆当初无知,分区,文件放置多有不合理,近日正烦闷,此为良机。刷之,因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不冤枉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值