无法理解&(sizeof 2 [a])[a]

Edi*_*ncı -1 c arrays string

我有一些输出的代码,bcdefg我不明白为什么。

我用谷歌搜索,但找不到任何东西。

const char a[]="Abcdefg";
printf("%s",&(sizeof 2[a])[a]);
Run Code Online (Sandbox Code Playgroud)

为什么是输出bcdefg,而不是Abcdefg

ana*_*lyg 7

该代码旨在使您感到困惑,而不做任何有用的事情。不要写这样的代码。这是编译器对其解释的方式:

  • 2[a]与相同a[2],后者是char类型的值(该值完全无关紧要;编译器甚至不尝试对其求值)
  • sizeof 2[a]与相同sizeof(char),等于1
  • &(sizeof 2[a])[a]是指向b字符串中字符的指针Abcdef-索引为1 的字符
  • printf("%s",&(sizeof 2[a])[a]) 从该指针开始打印字符串


Tom*_*zes 5

参考代码摘录:

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)