C++指针访问类似于程序集
C++ Pointer access similar to assembly
有时我在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属性"
- "在'constant'之前缺少';'"
"左操作数必须是l-value"。
//当我尝试指针算术时,
*(aa+1)=0//无错误
*(aa+0)=0//没有错误:)
对于运算符[]重载,此规则相同吗
MSVC++2010
谢谢。
这是C和C++的一个众所周知的怪癖,他们并不关心表达式的哪一半放在方括号[]
中。它们的评估结果都是相同的等价表达式:
*(0+aa)=15;
表达式a[b]
本质上被转换为*(a+b)
。这就是为什么这种"风格"的11[arr]
是可能的。
[aa]11
失败的原因纯粹是句法上的。
这种C++数组访问表示法是标准的吗?
是的。只要一个操作数是指针,另一个是算术,a[b]
就等价于*(a+b)
,所以指针或索引是否进入[]
内部都无关紧要。
如果是,它是从程序集寻址模式派生的吗?
几乎可以肯定不是。语法直接来自C,它最初是为PDP系列计算机开发的,其中的汇编寻址模式是1(aa)
。
当我尝试
[aa]1=5
时,编译器会给出(错误)
这是因为下标表达式的语法被指定为postfix-expression [ expression ]
,所以[]
中的操作数必须在另一个之后。
这个规则对于运算符[]重载是否相同?
没有。如果运算符已过载,则a[b]
等效于a.operator[](b)
,而不是b.operator[](a)
。
相关文章:
- 类似于strcat()的函数出现问题
- 内联程序集printf将整数解释为地址
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 算术运算的结果类似于:C浮点变量中的1/3
- 具有外部"c"和程序集的未定义函数
- 用于将C++代码转换为 Web 程序集的脚本未终止
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 使用程序集嵌入数据时"Undefined reference"错误,使用适用于窗口的 mingw-w64 编译(COFF 而不是 ELF)
- C++指针访问类似于程序集
- MFC:类似于Windows资源管理器的应用程序,可以与主线程并行导出文件
- g++ 中链接的预处理器程序类似于 gcc 中的 cpp 程序
- 类似于Windows 8下Metro风格应用程序的功能
- 类似于团结,但对于C++程序员来说
- 是否有一个类似于.NET框架的基于C++的DebianLinux web应用程序框架
- 程序类似于智能汇编,但适用于C++
- 类似于mspaint的应用程序编写.如何做好BitBlt
- 并集对象的行为类似于一个结构