首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为啥可以这样使用数组中的元素

2014-01-22 
为什么可以这样使用数组中的元素?假设int nums[] {1,2,3}想使用第3个元素3,可以这样nums[2] , 居然也可

为什么可以这样使用数组中的元素?
假设

int nums[] = {1,2,3};

想使用第3个元素3,可以这样nums[2] , 居然也可以这样使用
2[nums]

这是为什么呢?
[解决办法]
因为C语言中[]只是语法糖,它简单地用括号外面的地址加上括号里面的地址。因此交换它们的位置,结果一样。
nums[2]其实就是*(nums + 2)
2[nums]其实就是*(2 + nums)
[解决办法]
C 语言常见问题集
http://c-faq-chn.sourceforge.net/ccfaq/node83.html
7.8 我遇到一些 ``搞笑" 的代码, 包含 5["abcdef"]  这样的 ``表达式"。 这为什么是合法的 C 表达式呢 ?

是的, 弗吉尼亚7.1, 数组和下标在 C 语言中可以互换。这个奇怪的事实来自数组 下标的指针定义, 即对于任何两个表达式 a 和 e, 只要其中一个是 指针表达式而另一个为整数, 则 a[e] 和 *((a)+(e)) 完全一样。这种交换性 在许多 C 语言的书中被看作值得骄傲的东西, 但是它除了在混乱 C 语言竞赛 之外, 其实鲜有用武之地。

参考资料: [Rationale, Sec. 3.3.2.1]; [H&S, Sec. 5.4.1 p. 124, Sec. 7.4.1 pp. 186-7]。



脚注

... 弗吉尼亚7.1
这里有个美国典故, 在 1897 年, 有个叫 弗吉尼亚 (Virginia) 的八岁小女孩, 她对圣诞老人是否存在感到困惑, 因而写了封寻问信给《纽约太阳报》, 于是就有了 ``Yes, Virginia, there is a Santa Claus" 这篇评论, 有兴趣的朋友可以在  http://www.hymnsandcarolsofchristmas.com/santa/virginia's_question.htm 找到相关资料。
[解决办法]
∵A[B]等价于*(A+B)
又∵B[A]等价于*(B+A)
又∵A+B等价于B+A
∴*(A+B)等价于*(B+A)
综上所述:A[B]等价于B[A]

热点排行