使用printf语句的不寻常输出
这个问题在这里已经有了答案:
在你的情况
printf("%c",3["abcde"]);
可以读为
printf("%c","abcde"[3]);
或者,作为我们最熟悉的语法,
char p [] = "abcde";
printf("%c",p[3]);
它基本归结为访问数组索引3中的元素(C使用基于0的数组索引)。
这仅仅是一个用于数组索引的语法糖。 你可以使用任何你喜欢的方式。
如果你想挖掘更多的理解,你可以看看这个问题和相关的答案。
注意:是Nitpicky
你的片段是一个声明,不要称之为程序。
数组访问器操作符[]可以“双向运行”,所以3["abcde"]
等同于"abcde"[3]
,索引3(以0为开始)包含d。
编辑:
我们有一个字符串常量而不是变量的事实并不重要。 字符串常量存储在内存的只读部分,并隐式键入为const char *
。 因此,以下内容等同于您发布的内容:
const char *str = "abcde";
printf("%c",3[str]);
3["abcde"]
等同于*(3 + "abcde")
,因此等同于"abcde"[3]
。
当在表达式中使用时,除了一些例外, "abcde"
将被转换为指向其第一个元素的指针,即它基本上给出字符串"abcde"
的基地址。
将基地址添加到3
将给出字符串"abcde"
的第4个元素的地址,因此3["abcde"]
将给出第4个元素。