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

时间:2019-05-28 22:50:51

标签: c arrays string

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

我在Google上进行了搜索,但找不到任何内容。

const char a[]="Abcdefg";
printf("%s",&(sizeof 2[a])[a]);

为什么输出bcdefg而不是Abcdefg

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

请参阅代码摘录:

printf("%s",&(sizeof 2[a])[a]);

首先,大多数人没有意识到这一点,但是[]运算符实际上是可交换的。 a[b]等效于*(a + b),等效于*(b + a),等效于b[a]

因此2[a]等效于a[2]。由于a的类型为const char [],因此元素的大小与sizeof(char)相同,为1。

所以我们现在有:

printf("%s",&1[a]);

好吧,1[a]等效于a[1]*(a + 1)。应用地址运算符得出&a[1]a + 1(请注意&*x只是x)。

所以我们有:

printf("%s", a + 1);

这仅显示a + 1指向的字符串,即a的第一个字符之后的所有内容。

如果仅对[]运算符重新排序而没有做其他任何事情,则可以看到它等效于:

printf("%s", &a[sizeof a[2]]);

答案 2 :(得分:3)

如果细分每个细分:

&(sizeof 2[a])[a]

2[a] = a[2].  a[2] = a char element at position 2

sizeof(char) = 1

(1)[a] = a[1]

&(a[1]) = a reference to the 'b' in "bcdefg"

printf()然后打印从b开始并以空终止符结束的char数组