0

有时我在 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

谢谢你。

4

3 回答 3

5

这是 C 和 C++ 的一个众所周知的怪癖,它们并不真正关心表达式的哪一半放在方括号[]中。它们都计算为相同的等效表达式:

*(0+aa)=15;
于 2012-09-10T16:11:04.733 回答
4

表达式a[b]基本上被翻译成*(a+b). 这就是为什么这种“风格”11[arr]是可能的。

失败的原因[aa]11纯粹是句法。

于 2012-09-10T16:11:57.947 回答
3

这个 C++ 数组访问表示法是标准吗?

是的。只要一个操作数是指针,另一个是算术,a[b]就等价于*(a+b),所以无论是指针还是索引进入[].

如果是,它是从汇编寻址模式派生的吗?

几乎可以肯定不是。语法直接来自 C,它最初是为 PDP 系列计算机开发的,其中编写了汇编寻址模式1(aa)

当我尝试[aa]1=5时,编译器给出(错误)

这是因为下标表达式的语法被指定为postfix-expression [ expression ],所以 in 的操作数[]必须在另一个之后。

运算符 [] 重载的这条规则是否相同?

否。如果运算符已重载,则a[b]等于a.operator[](b),而不是b.operator[](a)

于 2012-09-10T16:29:13.133 回答