我有一些输出bcdefg
的代码,我不明白为什么。
我在Google上进行了搜索,但找不到任何内容。
const char a[]="Abcdefg";
printf("%s",&(sizeof 2[a])[a]);
为什么输出bcdefg
而不是Abcdefg
?
答案 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数组