有时我在 C++ 中看到不同的数组访问样式,并认为它可能与程序集寻址模式有关:
C++:
int * aa=new int[2];
0[aa]=15; //a little different than aa[0]
1[aa]=15;
aa[0]=15;
aa[1]=15;
printf("%d %d \n",aa[0],aa[1]);
程序集:
__asm
{
mov aa[0],ebx
mov aa[1],eax
mov 0[aa],ebx
mov 1[aa],eax
}
此 C++ 数组访问表示法是否为标准?如果是,它是否源自汇编寻址模式?
当我尝试 [aa]1=5;
时,编译器给出
- “未找到 aa 属性”,
- “缺少';'在‘常量’之前”
“左操作数必须是左值”。
//当我尝试指针运算时,
*(aa+1)=0//没有报错
*(aa+0)=0//没有报错:)
运算符 [] 重载的规则是否相同?
MSVC++ 2010
谢谢。
最佳答案
这是 C 和 C++ 的一个众所周知的怪癖,它们并不真正关心表达式的哪一半放在方括号 []
中。它们都计算为相同的等效表达式:
*(0+aa)=15;
关于C++ 类似于汇编的指针访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355464/