类似于汇编的C++指针访问 有时我在C++中看到不同的数组访问方式,认为它可能与汇编地址模式有关:

类似于汇编的C++指针访问 有时我在C++中看到不同的数组访问方式,认为它可能与汇编地址模式有关:,c++,arrays,pointers,assembly,C++,Arrays,Pointers,Assembly,C++: 大会: __asm { mov aa[0],ebx mov aa[1],eax mov 0[aa],ebx mov 1[aa],eax } 此C++数组访问符号是否为标准,如果是,是否从汇编地址模式派生? 当我尝试[aa]1=5,编译器给出 找不到aa属性, 缺少“;”在“常数”之前 左操作数必须是l值 //当我尝试指针运算时 *aa+1=0//未给出任何错误 *aa+0=0//未给出任何错误: 运算符[]重载的规则是否相同 MSVC++2010 谢谢

C++:

大会:

__asm
{
    mov aa[0],ebx
    mov aa[1],eax
    mov 0[aa],ebx
    mov 1[aa],eax
}

此C++数组访问符号是否为标准,如果是,是否从汇编地址模式派生?

当我尝试[aa]1=5,编译器给出

找不到aa属性, 缺少“;”在“常数”之前 左操作数必须是l值

//当我尝试指针运算时

*aa+1=0//未给出任何错误

*aa+0=0//未给出任何错误:

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

MSVC++2010


谢谢。

< P>这是C和C++的一个众所周知的怪癖,他们不在乎表达式的哪一半在方括号[]中。它们都计算为相同的等效表达式:

*(0+aa)=15;
表达式a[b]基本上被翻译成*a+b。 这就是为什么这种样式11[arr]是可能的

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

这个C++数组访问符号是标准?< /P> 对。只要一个操作数是指针,另一个是算术操作数,a[b]就相当于*a+b,因此指针或索引是否位于[]内并不重要

如果是,它是否派生自程序集寻址模式

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

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

这是因为下标表达式的语法指定为后缀表达式[expression],因此[]中的操作数必须位于另一个操作数之后

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


不,如果运算符已经过载,那么[B]相当于A.运算符[]B,而不是B.Tale[] A/< P>这两个是无关的-C早在80x86上很多年。在实际C++代码中,你在哪里看到0(AA]=15的东西?它是合法的,但大多数人不会使用它,除非他们吸烟,而不是运算符重载[]?运算符重载在这里是完全正交的,因为它允许在使用[]运算符时调用任何行为。@slugonamission:但是,重载必须是非静态类成员,因此,通常不能定义重载,使0[aa]等同于aa[0]。@MikeSeymour-当然,我只是想指出,不能将重载[]运算符与C默认[]运算符进行对比

*(0+aa)=15;