杜安 发表于 2019-7-20 17:14:47

关于C++中cout的问题



如图,第二行代码出现这样的效果是什么原因
请问这里是有什么知识点吗

Croper 发表于 2019-7-20 17:24:38

“1 + 1=”的类型是char*,字符串指针加2等于右移两个单位,所以结果是“+1=”

Croper 发表于 2019-7-20 17:27:48

本帖最后由 Croper 于 2019-7-20 17:46 编辑

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

#define unix 1//这一句时我加的,这是当时编译器自带的一个宏
main() {printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60);}
这可以打印出什么?

Croper 发表于 2019-7-20 17:45:38

本帖最后由 Croper 于 2019-7-20 17:47 编辑

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

&1["\021%six\012\0"]

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


同理
(unix)["have"]

"have"

'a'

0x61

所以,
后面那一串
(unix)["have"] + "fun" - 0x60
就是
0x61+ "fun" - 0x60
就是
"fun" +1
就是
"un"

因此,整个代码是
main() {printf("%six\n", "un");}
输出
unix

以上内容参考于:https://blog.csdn.net/yangluoning/article/details/12611823

杜安 发表于 2019-7-20 18:31:39

Croper 发表于 2019-7-20 17:45
分析一下:
首先把字符串看成一个整体



哇!谢谢谢谢!太厉害了这个

冷月无痕 发表于 2019-7-21 20:04:37

{:10_279:}
页: [1]
查看完整版本: 关于C++中cout的问题