在 stackoverflow 上看看: In C arrays why is this true? a[5] == 5[a]
在《C专家编程》中有详细的解释。
c[5] 也就是
*(c+5)
由于加法满足交换律,于是
*(c+5) == *(5+c)
于是有
c[5] == 5[c]
c[5]会被计算成:
而5[a]会被计算成:
*(5+c)
在c语言中,数组可以被看成指针。
若windows下开发C,使用Disassembly功能,看下汇编代码就明白了。
其实[]算是个运算符。在汇编中有种寻址方式可以使ds[ex],ex[ds]。他的意思其实就是简单的段地址*16+偏移地址。那么在C里也差不多a[5]表示的地址是a+5当然,5[a]也是表示a+5.所以两者是一样的。
C[5];//底层处理为 *(C+5)5[C];//底层处理为 *(5+C)/*任何 A[B]处理为 *(A+B)A,B可以是任何有效值;最终计算出数据所在的地址,*这个运算符就由地址得到数据.地址相等,则目标相同,即数据相等*/
c[5] == 5[c] 这种代码如果是汇编的话,就容易理解
不好意思,用ipad 回答的。不知道怎么没答上去。
c[5]是数组,这毫无疑问。如果要进行相等比较。那就是说5[c]也是数组。对,在C语言中字母是直接当数字来处理。但我敢很肯定的说c的ascii码绝不是5。
在C中,数组名是可以当成指针来处理。但数组名不是指针。就算是,指针也不能做相等比较吧。
一段很有趣的代码。
#include <stdio.h>int main(int argc, char** argv){int a=3, b = 5;
printf(&a["Ya!Hello! how is this? %sn"], &b["junk/super"]);
printf(&a["WHAT%c%c%c %c%c %c !n"], 1["this"],2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);
return 0;}
它的输出是:
Hello! how is this? superThat is C !
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(8)
在 stackoverflow 上看看: In C arrays why is this true? a[5] == 5[a]
在《C专家编程》中有详细的解释。
c[5] 也就是
*(c+5)
由于加法满足交换律,于是
*(c+5) == *(5+c)
于是有
c[5] == 5[c]
c[5]会被计算成:
*(c+5)
而5[a]会被计算成:
*(5+c)
在c语言中,数组可以被看成指针。
若windows下开发C,使用Disassembly功能,看下汇编代码就明白了。
其实[]算是个运算符。在汇编中有种寻址方式可以使ds[ex],ex[ds]。他的意思其实就是简单的段地址*16+偏移地址。那么在C里也差不多a[5]表示的地址是a+5当然,5[a]也是表示a+5.所以两者是一样的。
C[5];//底层处理为 *(C+5)
5[C];//底层处理为 *(5+C)
/*
任何 A[B]
处理为 *(A+B)
A,B可以是任何有效值;
最终计算出数据所在的地址,*这个运算符就由地址得到数据.
地址相等,则目标相同,即数据相等
*/
c[5] == 5[c] 这种代码如果是汇编的话,就容易理解
不好意思,用ipad 回答的。不知道怎么没答上去。
c[5]是数组,这毫无疑问。如果要进行相等比较。那就是说5[c]也是数组。
对,在C语言中字母是直接当数字来处理。但我敢很肯定的说c的ascii码绝不是5。
在C中,数组名是可以当成指针来处理。但数组名不是指针。就算是,指针也不能做相等比较吧。
一段很有趣的代码。
#include <stdio.h>
int main(int argc, char** argv)
{
int a=3, b = 5;
printf(&a["Ya!Hello! how is this? %sn"], &b["junk/super"]);
printf(&a["WHAT%c%c%c %c%c %c !n"], 1["this"],
2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);
return 0;
}
它的输出是:
Hello! how is this? super
That is C !