我有一些输出的代码,bcdefg我不明白为什么。
我用谷歌搜索,但找不到任何东西。
const char a[]="Abcdefg";
printf("%s",&(sizeof 2[a])[a]);
Run Code Online (Sandbox Code Playgroud)
为什么是输出bcdefg,而不是Abcdefg?
该代码旨在使您感到困惑,而不做任何有用的事情。不要写这样的代码。这是编译器对其解释的方式:
2[a]与相同a[2],后者是char类型的值(该值完全无关紧要;编译器甚至不尝试对其求值)sizeof 2[a]与相同sizeof(char),等于1&(sizeof 2[a])[a]是指向b字符串中字符的指针Abcdef-索引为1 的字符printf("%s",&(sizeof 2[a])[a]) 从该指针开始打印字符串参考代码摘录:
printf("%s",&(sizeof 2[a])[a]);
Run Code Online (Sandbox Code Playgroud)
首先,大多数人没有意识到它,但是[]运算符实际上是可交换的。 a[b]等于*(a + b),等于*(b + a),等于b[a]。
所以2[a]等于a[2]。由于a具有类型const char [],因此元素的大小与相同sizeof(char),即为1。
所以我们现在有:
printf("%s",&1[a]);
Run Code Online (Sandbox Code Playgroud)
好吧,1[a]等同于a[1]或*(a + 1)。应用address-of运算符可得到&a[1]或a + 1(请注意,&*x仅仅是x)。
因此,我们有:
printf("%s", a + 1);
Run Code Online (Sandbox Code Playgroud)
这只是打印由指向的字符串a + 1,即的第一个字符之后的所有内容a。
如果仅对[]运算符重新排序而不做其他任何事情,则可以看到它等效于:
printf("%s", &a[sizeof a[2]]);
Run Code Online (Sandbox Code Playgroud)