今天在忙着复习基础知识等者明天实习HR的电面的时候,在大牛交流群(我是去学习的)里面,有位大牛出了一道比较有意思的题目,本想出细细思考的,但是出于时间考虑,还是先复习了,所以,特此记下这道题,过几天有时间了再回来看看。 题目:
#include "stdafx.h" //maybe need commented in some condition
#include "stdio.h"
int main()
{
printf(&(NULL+1)["\021%sDa\012\0"],(NULL)["a"]+"li"+(EOF)["baba"]-0x60);
return 0;
}
试写出输出结果。
好了 今天终于有时间来决解这个问题,自己在编译器细细观察了过程,同时复习EOF 、 NULL的含义,终于有所眉目。下面是我的解答过程。
1、首先观察这个结构
(&(NULL+1)[“\021%sDa\012\0”],(NULL)[“a”]+”li”+(EOF)[“baba”]-0x60)
2、先看这部分(NULL)[“a”]+”li”+(EOF)[“baba”]-0x60),
NULL 默认为宏定义为0,而(NULL)[“a”]表示为这个字符index为NULL的字符,即为’a’,
而‘a’的UNICODE为 ‘a’= 0x0061(因为后面有个减0x60考虑到先转化为unicode简化),得到0x0001,+一个字符串即表示为首指针向后移一位,所以“li”变为“i”,EOF是文件结束表示,它什么也不表示,所以可以忽视。
3、再看前半部
&(NULL+1)[“\021%sDa\012\0”],%s表示是,后面的”i”,可以去掉,&(NULL+1)[“\021iDa\012\0”],NULL+1,表示[ ]内字符串基指针向后移一位,所以这个\021表示的字符没有了,而\012等同于\n所以中和结果就出来了,就是iDa
输出iDa