免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 10481 | 回复: 41

关于printf的奇怪用法 [复制链接]

论坛徽章:
0
发表于 2005-07-19 23:13 |显示全部楼层
如下,输出结果uniz,不过没看明白,有谁代为解释,3k
printf(&unix["\021%siz\012\0"], (unix)["have"] + "fun" - 0x60);

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2005-07-20 08:59 |显示全部楼层

关于printf的奇怪用法

呵呵.这个问题我来解释一下吧.

首先看一段代码:
  1. #include <stdio.h>;

  2. int main()
  3. {
  4.     int a[5]={1,2,3,4,5};
  5.     printf("%d\n",3[a]);
  6.     return 0;
  7. }
复制代码


在C语言中 其实数组的引用可以 3[a]这样的形式的. 等价于a[3];
再看下面一段代码:
  1. #include <stdio.h>;

  2. int main()
  3. {
  4.     int a[5]={1,2,3,4,5},i=4;
  5.     printf("%d\n",3[a]);
  6.     printf("%d\n",i[a]);
  7.     return 0;
  8. }
复制代码


这样的表示也是可以的 实际上相当与 i[a]实际上相当于a[4]了

再看下面一段代码:
  1. #include <stdio.h>;

  2. int main()
  3. {
  4.     printf("%d\n",unix);
  5.    
  6.     return 0;
  7. }
复制代码


为什么我没有定义unix也能打印出来呢? 原因是unix 被编译器内定为一个 宏.
相当于#define unix 1 这样打印出来1

下面来解释一下这个问题.
  1. #include <stdio.h>;

  2. int main()
  3. {

  4.     printf("%c\n",(unix)["have"]);

  5.     return 0;
  6. }
复制代码

这里的unix相当于1 那么 unix["have"]相当于 "have"[1]  我们都知道"have"是个字符数组. 那么 "have"[1]就相当于引用这个"have"数组下标为1的字符了 实际上就是a;

  1. #include <stdio.h>;

  2. int main()
  3. {
  4.     printf("0x%x",'a');
  5.     return 0;
  6. }
复制代码

a的asc码的16进制表示为0x61.
(unix)["have"]+"fun"-0x60
中就相当于0x61-0x60+"fun"相当于 0x01+"fun" 相当于字符指针后移相当于"un"了
这样后面的部分解释完了。~
下面解释前面的.

论坛徽章:
0
发表于 2005-07-20 09:01 |显示全部楼层

关于printf的奇怪用法

unix=1

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2005-07-20 09:07 |显示全部楼层

关于printf的奇怪用法

  1. #include <stdio.h>;

  2. int main()
  3. {
  4.     printf(&unix["\021ix\012\0"]);
  5.     return 0;
  6. }
复制代码


前面的部分 我们首先把%s去掉. %s实际上是刚刚讲过的"un"的格式.
我们知道unix宏的值 是1. 那么
  1. printf(&unix["\021ix\012\0"]);
复制代码

相当于
  1. printf(&1["\021ix\012\0"]);
复制代码

根据上贴我说的 1["have"]这个形式 同理能得到
  1. printf(&"\021ix\012\0"[1]);
复制代码
这个形式了.

这个引用和上面的有所区别 区别在于&. 那么一个字符数组从它的下标为1 的元素取地址就可以得到一个字符串了.
还原回去.
相当于
  1. printf(&"\021%six\012\0"[1],"un");
复制代码

也就是说把第一个元素跳过去了把\021跳了过去.相当于

  1. printf("%six\012\0","un");
复制代码

这样了.
\012 是asc码里的回车.这个串相当于
  1. printf("%six\n\0","un");
复制代码


至此 这个问题解决了..
问题应该是.printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60);
打印unix 楼主写错了~~

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2005-07-20 09:08 |显示全部楼层

关于printf的奇怪用法

再补充一点.~~ windows下要想成功这段 代码 定义#define unix 1就可以了

论坛徽章:
0
发表于 2005-07-20 09:28 |显示全部楼层

关于printf的奇怪用法

把代码写成这样有什么意义?
唾弃之。

论坛徽章:
0
发表于 2005-07-20 09:29 |显示全部楼层

关于printf的奇怪用法

原帖由 "高峰" 发表:
把代码写成这样有什么意义?
唾弃之。


别学到了东西 还骂.~BS

佩服mq110 大大.

论坛徽章:
0
发表于 2005-07-20 09:29 |显示全部楼层

关于printf的奇怪用法

      
      
这么简单的printf,这么复杂的用法,  汗

受教

论坛徽章:
0
发表于 2005-07-20 09:30 |显示全部楼层

关于printf的奇怪用法

thx, studying...

论坛徽章:
0
发表于 2005-07-20 09:34 |显示全部楼层

关于printf的奇怪用法

俺当然佩服mq110 老大了,只是唾弃写这代码的人。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP