【问题标题】:How the pre and post increment work in c++? [closed]c++ 中的前置和后置增量如何工作? [关闭]
【发布时间】:2014-10-13 04:05:55
【问题描述】:

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

【问题讨论】:

  • 编译器不执行它。它生成的机器代码会因所编译的处理器而异。
  • “确切方式”显然取决于编译器和语言。 (而且,吹毛求疵:编译器不会“执行”它找到的任何代码;它只是将其编译为中间形式,供链接器稍后使用。)
  • 这是一个有用的工具,用于探索编译器对您的代码做了什么。 gcc.godbolt.org 只需输入您的代码,它将显示 gcc 将生成的汇编代码。如果您希望它是精确的翻译,请记住关闭优化。
  • 这些运算符可以在 C++ 中重载,我假设您要求的是内置类型 (int, float ...) ?你的问题应该更准确。
  • 如果您想知道确切的方法,唯一正确的答案是查看您关心的编译器的源代码。

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


【解决方案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
}

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

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

【讨论】:

    猜你喜欢
    • 2021-08-22
    • 2014-06-03
    • 2012-03-07
    • 2012-07-11
    • 1970-01-01
    • 2016-03-15
    • 2015-12-21
    • 2012-06-01
    • 2017-04-07
    相关资源
    最近更新 更多