关于C++中cout的问题
如图,第二行代码出现这样的效果是什么原因
请问这里是有什么知识点吗 “1 + 1=”的类型是char*,字符串指针加2等于右移两个单位,所以结果是“+1=” 本帖最后由 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: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 Croper 发表于 2019-7-20 17:45
分析一下:
首先把字符串看成一个整体
哇!谢谢谢谢!太厉害了这个 {:10_279:}
页:
[1]