- 论坛徽章:
- 0
|
内建式++和--操作符可以出现在一个操作数的任何一边:
int n=0;
++n; // 前缀++
n++; // 后缀 ++
深入理解前缀和后缀操作符的语义区别是正确地处理各种算法表达式,调试程序,以及性能分析的关键。
虽然这些操作符的执行在很大程序上依赖于硬件体系和使用的编译器,但我还是想通过一些具体的范例来说明两个不同类型的操作符之间的通用的语义区别。如果你想检查程序执行过程,可以编译以下提供的代码片段,并查看编译器如何执行前缀和后缀的操作符。
一个前缀的操作符首先改变它的操作数,然后使用运行之后的值,例如:
int n=0;
int m=0;
n= ++m; // 累加m, 然后赋值给n
std::cout <<n <<", "<<m<<std::endl; // 显示1, 1
在这种情况,经过赋值之后,n的值为1,因为m在被赋予n之前就递增。现在让我们看一看后缀的情况。
int n=0;
int m=0;
n=m++; // 首先将m的值赋给n, 然后m递增
std::cout <<n <<", "<<m<<std::endl; //显示0, 1
这一情况,经过赋值之后n为0.这是因为,在++操作符递增之前m的原始值被赋予n.
检查这两个代码列表生成的汇编代码有助于你更深入地理解这些操作符的执行。
// disassembled code of m=n++;
mov ecx, [ebp-0x04] // store n's value in ecx register
mov [ebp-0x08], ecx // assign ecx's value to m
inc dword ptr [ebp-0x04] // increment n
// disassembled code of m=++n;
inc dword ptr [ebp-0x04] // increment n
mov eax, [ebp-0x04] // store n's value in eax register
mov [ebp-0x08], eax // assign eax's value to m |
|