一道关于编译和指针的题目

今天在忙着复习基础知识等者明天实习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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值