c语言问题集中的一个问题,包含 5["abcdef "] 这样的 “表达式”

yandong 发布于 2012/08/07 15:11
阅读 367
收藏 0
c语言问题集中的一个问题  

6.8 我遇到一些 “搞笑” 的代码, 包含 5["abcdef "] 这样的 “表达式”。
这为什么是合法的 C 表达式呢?
是的, 弗吉尼亚1 , 数组和下标在 C 语言中可以互换。这个奇怪的事实来自数
组下标的指针定义, 即对于任何两个表达式 a 和 e, 只要其中一个是指针表达式而
另一个为整数, 则 a[e] 和 *((a)+(e)) 完全一样。这种交换性在许多 C 语言的书中
被看作值得骄傲的东西, 但是它除了在混乱 C 语言竞赛之外, 其实鲜有用武之地。

这段话说的什么意思啊?????????如何写代码测试这句话?
加载中
0
zodiac1111
zodiac1111
“hello”[2]

2["hello"]

如果你知道:a[i] 其实就是 *(a+i)也就是 *(i+a),所以如果写成 i[a] 应该也不难理解了。
http://coolshell.cn/articles/945.html

yandong
yandong
嗯嗯,看了代码就容易理解多了
0
leo108
leo108

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

printf("%d",2[a]); // 3

0
洪文军

5["abcdef "]    等价于    "abcdef " [5]  

5[str] 等价于 str[5]

yandong
yandong
谢谢,明白了
0
yandong
yandong
理解了,看下面的代码
if("abcdef"[5] == 5["abcdef"])
	printf("==\n");

printf("%c\n", "abcdef"[5]);

最后的输出是
==
f

这是数组下标交换
0
洪文军

int a[]={1,2,3,4,5};

a[2] 等价于 *(a+2) // 数组名解释为指针, a+2 ,就是指针偏移加 +2 ,然后解引用

0
mingshun
mingshun
建议你看看Pointers on C这本书,会发现更多令你惊奇的东西。
0
琵琶美酒

其实数组也被当作一个指针,典型的指针相加问题,貌似在汇编语言里面有类似的东西。寄存器和偏移量?

0
中山野鬼
中山野鬼

引用来自“mingshun”的答案

建议你看看Pointers on C这本书,会发现更多令你惊奇的东西。
哈。很正常的。不过这些所谓的惊喜能不用就不用。
返回顶部
顶部