1

我们可以在不声明新变量的情况下将 aconst int转换为C++ 中的 a 吗?int此选项在 VS 中可用,但如何在 Xcode、代码块等其他编译器中使用它?

const int a = 5 ;
int (a) ++ ;
4

2 回答 2

4

a is const. You can't legally remove the constness to mutate the variable in any compiler. What you're seeing in VS is that it's letting you create an unnamed temporary and incrementing THAT.

于 2013-10-16T19:28:45.327 回答
0

TL;DR:您可以更改 const 变量的值,但不能保证您的代码会像您所做的那样运行。

当然,有一种方法可以做到这一点,但首先让我们确保你明白你要求做什么:

const int a = 5;

这告诉编译器有一个值 5,您想将其称为“a”,例如,您可以这样做:

const int MaxNameLen = 5;
char name[MaxNameLen + 1];

或者

const float pi = 3.14;
return pi * radius;

在没有优化的情况下编译,这可能会生成像其他任何变量一样注入变量并按照您的预期使用它的代码。

但是通过调用变量“const”,您已经与编译器签订了合同:表现得就像这个值不会改变一样。所以你可以这样做,例如:

int a = 5;
*(static_cast<int*>(&a))++;

但就编译器而言, a 并没有改变。它可以自由地继续表现,因为它没有。因此,如果它将它加载到一个寄存器中,如果它基于它来调整大小,那么它可以自由地继续并假设它可以在任何看到“a”的地方使用值“5”。例如:

#include <iostream>
using namespace std;

int main()
    {
    const int a = 5;
    (*const_cast<int*>(&a))++;
    std::cout << "a = " << a << std::endl;
}

可能会打印 5 或可能会打印 6,这取决于哪个编译器、哪些设置和代码的上下文。变量“a”有一个地址,但你告诉编译器它不会改变,所以它可能已经将它压入堆栈或加载到寄存器中。

这将对您造成最严重的伤害的地方是高度优化的,因为编译器将根据您对“a”不会改变的承诺生成指令和排序。

于 2013-10-16T21:00:11.440 回答