前后增量如何在c ++中工作?

时间:2014-08-19 22:16:10

标签: c++ increment post-increment pre-increment

我想知道增量/减量运算符结果是否因编译器而异,或者它与编译器无关。因为我在c / c ++的不同编译器(在G ++,TDM,gcc中测试)得到不同的结果用于相同的表达式。

1 个答案:

答案 0 :(得分:1)

让我们看一下内部llvm程序集。这不难做到。

C ++代码:

void preincrement() __attribute__((noinline));
void preincrement() {
    volatile int x = 10;
    volatile int y = ++x;
}

void postincrement() __attribute__((noinline));
void postincrement() {
    volatile int x = 10;
    volatile int y = x++;
}

int main()
{
    preincrement();
    postincrement();
}

结果LLVM程序集(减去一些不感兴趣的前导和尾随文本):

; Function Attrs: noinline nounwind uwtable
define void @_Z12preincrementv() #0 {
  %x = alloca i32, align 4
  %y = alloca i32, align 4
  store volatile i32 10, i32* %x, align 4
  %1 = load volatile i32* %x, align 4
  %2 = add nsw i32 %1, 1
  store volatile i32 %2, i32* %x, align 4
  store volatile i32 %2, i32* %y, align 4
  ret void
}

; Function Attrs: noinline nounwind uwtable
define void @_Z13postincrementv() #0 {
  %x = alloca i32, align 4
  %y = alloca i32, align 4
  store volatile i32 10, i32* %x, align 4
  %1 = load volatile i32* %x, align 4
  %2 = add nsw i32 %1, 1
  store volatile i32 %2, i32* %x, align 4
  store volatile i32 %1, i32* %y, align 4
  ret void
}

; Function Attrs: nounwind uwtable
define i32 @main() #1 {
  tail call void @_Z12preincrementv()
  tail call void @_Z13postincrementv()
  ret i32 0
}

我们在这里可以清楚地看到唯一的区别:在后期增量版本中,我们使用原始值,而不是升级后的值。

在这两种情况下,我们只使用传统的添加操作码来完成实际工作。