Che*_*Alf 109
到目前为止,所有四个答案都是不正确的,因为它们声明了特定的事件顺序.
相信"都市传奇"已经导致许多新手(和专业人士)误入歧途,即表达式中关于未定义行为的无穷无尽的问题.
所以.
对于内置的C++前缀运算符,
++x
Run Code Online (Sandbox Code Playgroud)
递增x并产生表达式结果x作为左值,而
x++
Run Code Online (Sandbox Code Playgroud)
递增x并生成表达式结果的原始值x.
特别是,x++没有任何时间订货隐含的原始值的增加和生产x.编译器可以自由地发出产生原始值的机器代码x,例如它可能存在于某个寄存器中,并将增量延迟到表达式的结尾(下一个序列点).
不正确地相信增量的人必须首先出现,并且他们很多,通常得出结论,当某些表达式实际上具有未定义的行为时,它们必须具有明确定义的效果.
sje*_*397 27
int i, x;
i = 2;
x = ++i;
// now i = 3, x = 3
i = 2;
x = i++;
// now i = 3, x = 2
Run Code Online (Sandbox Code Playgroud)
'Post'表示之后 - 也就是说,在读取变量之后完成增量.'Pre'表示之前 - 所以变量值首先递增,然后在表达式中使用.
mat*_*ens 17
没有人回答这个问题: 为什么这个概念令人困惑?
作为一门本科计算机科学专业,由于我阅读代码的方式,我花了一些时间来理解这一点.
以下是不正确的!
x = y ++
X等于y post增量.这在逻辑上似乎意味着X 在增量操作完成后等于Y的值.帖子的意思后.
要么
x = ++ y
X等于y pre -increment.这在逻辑上似乎意味着X 在增量操作完成之前等于Y的值.预含义之前.
它的工作方式实际上恰恰相反.这个概念令人困惑,因为这种语言具有误导性.在这种情况下,我们不能使用这些词来定义行为.
实际读取x = ++ y,因为X等于增量后的Y值.
实际上读取x = y ++,因为X等于增量前的Y值.
关于英语的语义,前后词是倒退的.它们只表示++与Y相关的位置.仅此而已.
就个人而言,如果我有选择,我会改变++ y和y ++的含义.这只是我必须学习的成语的一个例子.
如果有一种解决这种疯狂的方法,我想简单地说一下.
谢谢阅读.
wil*_*ell 14
后缀增量x++和前缀增量之间的差异++x恰恰在于两个运算符如何评估其操作数.后缀增量在概念上将操作数复制到内存中,递增原始操作数并最终生成副本的值.我认为最好通过在代码中实现运算符来说明:
int operator ++ (int& n) // postfix increment
{
int tmp = n;
n = n + 1;
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将无法编译,因为您无法为原始类型重新定义运算符.编译器也不能告诉我们这里我们定义的是一个后缀运算符而不是前缀,但让我们假装这是正确有效的C++.您可以看到后缀运算符确实作用于其操作数,但它在递增之前返回旧值,因此表达式的结果x++是递增之前的值.x然而,被递增.
前缀增量也会增加其操作数,但它会在增量后产生操作数的值:
int& operator ++ (int& n)
{
n = n + 1;
return n;
}
Run Code Online (Sandbox Code Playgroud)
这意味着表达式++x计算增量x 后的值.
很容易认为表达式++x等同于assignmnet (x=x+1).然而,这并非如此,因为增量是一种在不同环境中可能意味着不同事物的操作.在简单的原始整数的情况下,确实++x可以替代(x=x+1).但是在类类型的情况下,例如链表的迭代器,迭代器的前缀增量绝对不意味着"向对象添加一个".
这很简单.两者都会增加变量的值.以下两行相同:
x++;
++x;
Run Code Online (Sandbox Code Playgroud)
不同之处在于,如果您使用的是增量变量的值:
x = y++;
x = ++y;
Run Code Online (Sandbox Code Playgroud)
这里,两条线都将y的值递增1.但是,第一个在增量之前将y的值赋给x,第二个在增量之后将y的值赋给x.
因此,当增量也被用作表达式时,只有区别.返回值后的后增量递增.之前的增量前递增.
int i = 1;
int j = 1;
int k = i++; // post increment
int l = ++j; // pre increment
std::cout << k; // prints 1
std::cout << l; // prints 2
Run Code Online (Sandbox Code Playgroud)
后递增意味着该值i在分配给 后递增k。然而,预递增意味着值 j 在分配给 之前先递增l。
这同样适用于减量。