实施++;c+中的运算符+; C++中定义的标准++操作符是怎样的?(C++ 11)< /P>

实施++;c+中的运算符+; C++中定义的标准++操作符是怎样的?(C++ 11)< /P>,c++,operators,C++,Operators,例如 int k, i=3; k = i++; 首先将i的值赋值为3,然后递增i 有人能解释一下这是如何实现的吗 另外,是否复制了变量?当为类创建重载时,您可以这样编写它: T& T::operator++() // pre-increment, return *this by reference { // increment something, somehow // maybe there is local int i and you will type 'i = i +

例如

int k, i=3;
k = i++;
首先将i的值赋值为3,然后递增i

有人能解释一下这是如何实现的吗


另外,是否复制了变量?

当为类创建重载时,您可以这样编写它:

T& T::operator++() // pre-increment, return *this by reference
{
  // increment something, somehow
  // maybe there is local int i and you will type 'i = i + 1;' or '++i;'
  // so whatever 'increment by one' means in your case.

  // for type 'int', this function would result in (an instruction | a series of instructions)
  // that increment the variable by one.
  return *this;
}

T T::operator++(int) // post-increment
{
  T copy(*this);
  ++(*this);// pre-increment here seems logical
  return copy;
}
如您所见,在实际数据递增后,将创建并返回一个临时值。因此,当实际值递增时,返回的值是旧值


对于内置类型,它使用相同的逻辑。如何做到这一点取决于实施这些操作的人员,并且可能会有所不同。但是它的工作原理是一样的。

在C/C++语言中,您有前置增量和后置增量。增量前的值在增量前返回,增量后的值返回已增量的值

以下是维基百科的摘录:

int  x;
int  y;

// Increment operators
x = 1;
y = ++x;    // x is now 2, y is also 2
y = x++;    // x is now 3, y is 2

// Decrement operators
x = 3;
y = x--;    // x is now 2, y is 3
y = --x;    // x is now 1, y is also 1
更多关于

GCC内部解释了这一点:

计算单个操作数的值,并递增或递减操作数。在PREDECREMENT_EXPR和PREINCREMENT_EXPR的情况下,表达式的值是增量或减量后产生的值;在后减量_EXPR和后加量_EXPR的情况下,是发生增量或减量之前的值。操作数的类型与结果的类型一样,可以是整型、布尔型或浮点型


该标准只定义了它的功能,而不是如何实施。

对于引用,你会发现它在C++标准,第5.5.6节[递增和递减]:

中。 后缀的值 ++表达式是其操作数的值。[注:获得的值是原始值的副本-结束注]操作数应为 可修改左值。操作数的类型应为算术类型 或指向完整对象类型的指针。操作数的值 对象通过向其添加1进行修改,除非该对象的类型为 bool,在这种情况下,它被设置为true。[注:此用途为 已弃用,参见附录D.-结束注释]
++表达式在修改操作数对象之前排序。对于不确定顺序的函数调用, 后缀运算 ++这是一个单一的评估。[注:因此,函数调用不应干预左值到右值的转换和边值转换 与任何单个postfix++运算符关联的效果。-结束注释] 结果是一个pr值。结果类型为cv不合格 操作数类型的版本


post-fix++,如
i++
,如下所示(在int的情况下):

前缀++,如
++i
中所示,如下所示(同样适用于int):


你们明白为什么前缀++和--被认为更有效了吗?

若你们发现问题不完整,请发表评论。我是新来的。不知道你所说的“这是如何实现的”,你在寻找什么?标准的段落,或者这是如何在asm或其他东西中实现的?它是以编译器想要的任何方式实现的。实际上,该声明被分成两部分。但是你需要注意,
++
相对于整个语句中的其他表达式何时生效的定义非常混乱。谢谢你,标准段落。我避免在效果不明显的地方使用
++
。就像每当我对优先规则有点不确定时,我都会加入额外的
()
,这不值得担心<代码>++在60年代是一种性能优化,但自1975年以来,任何编译器都知道如何生成更好的代码,而不必使用“关于不确定顺序的函数调用,postfix++的操作是一次单独的评估。[注:因此,函数调用不应介入左值到右值的转换以及与任何单个postfix++运算符相关的副作用。-结束注]结果是一个prvalue。结果的类型是操作数类型的cv非限定版本。“你能解释更多吗?这意味着(简而言之)当编译器需要计算多个函数调用(包括++)时,在计算运算符++的最终(pvalue)结果时,不应计算这些函数中的任何函数(在任何情况下都应视为原子计算)。否则,标准不允许这样做(例如,在相反的情况下,编译器可以在参数求值期间按其希望的任何顺序求值函数调用)
int operator++(int i)
{
    int temp = i;
    i = i + 1;
    return temp;
}
int operator++()
{
    return i + 1;
}