我有一些输出的代码,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)