鱼C论坛

 找回密码
 立即注册
查看: 1110|回复: 5

[已解决]关于C++中cout的问题

[复制链接]
发表于 2019-7-20 17:14:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
QQ图片20190720171140.png

如图,第二行代码出现这样的效果是什么原因
请问这里是有什么知识点吗
最佳答案
2019-7-20 17:24:38
“1 + 1=”的类型是char*,字符串指针加2等于右移两个单位,所以结果是“+1=”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-20 17:24:38 | 显示全部楼层    本楼为最佳答案   
“1 + 1=”的类型是char*,字符串指针加2等于右移两个单位,所以结果是“+1=”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-20 17:27:48 | 显示全部楼层
本帖最后由 Croper 于 2019-7-20 17:46 编辑

这基本可以算是奇技淫巧了,比如ioccc(国际c语言混乱代码大赛)1987年的一段代码

  1. #define unix 1  //这一句时我加的,这是当时编译器自带的一个宏
  2. main() {printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60);}
复制代码

这可以打印出什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-20 17:45:38 | 显示全部楼层
本帖最后由 Croper 于 2019-7-20 17:47 编辑

分析一下:
首先把字符串看成一个整体
  1. &unix["\021%six\012\0"]
复制代码


  1. &1["\021%six\012\0"]
复制代码


  1. &*("\021%six\012\0"+1)
复制代码

"\021%six\012\0"+1即跳过第一个字符,注意,第一个字符是'\021',
而&*解引用再取地址,等于没有进行计算,
此外 \012就是换行符,即常用的\n
而 \0已经是字符串结束标签了,所以,这一串其实是
  1. "%six\n"
复制代码



同理
  1. (unix)["have"]
复制代码


  1. "have"[1]
复制代码


  1. 'a'
复制代码


  1. 0x61
复制代码


所以,
后面那一串
  1. (unix)["have"] + "fun" - 0x60
复制代码

就是
  1. 0x61+ "fun" - 0x60
复制代码

就是
  1. "fun" +1
复制代码

就是
  1. "un"
复制代码


因此,整个代码是
  1. main() {printf("%six\n", "un");}
复制代码

输出
unix

以上内容参考于:https://blog.csdn.net/yangluoning/article/details/12611823
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-20 18:31:39 | 显示全部楼层
Croper 发表于 2019-7-20 17:45
分析一下:
首先把字符串看成一个整体

哇!谢谢谢谢!太厉害了这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-21 20:04:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 13:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表