2016-01-13 105 views
0

我有以下代码:指向const的指针。指针改变,但const的没有变化

int main(void) { 
    const int a = 2; 
    int *p = (int *)&a; 
    ++*p; 
    cout << a << endl << *p << endl; 
    cout << &a << endl << p << endl; 

    return 0; 
} 

指针指向const int a但是当我改变*指针。 *p = 3a = 2;
虽然p和a具有相同的地址。
我不知道如何创建这个结果。 任何人都可以为我解释。谢谢!

+2

未定义的行为意味着任何事情都可能发生:) –

回答

6

您不允许修改const对象。修改const对象(通过非const指针)具有未定义的行为。 UB意味着任何事情都可能发生。具有未定义的行为是程序员的错误。

虽然它主要是没有意义的推理UB,在这种情况下,观察到的行为可能是由于constant folding

+0

但它有相同的地址。这是我的错,C++错误还是什么? –

+0

您不得修改const对象。但你做到了。这是你的错误。地址是无关紧要的。 – user2079303

+2

@DungNguyen编译器用'cout << 2'替换了'cout << a',因为'a'是一个常量。它不必考虑'a'改变的可能性,即使你为此而改变,因为这样做是明确禁止的。 “未定义行为”表示您观察到的差异:由于'const'合同已被破坏,所以没有任何意义,也没有必要。 – Quentin

2

答案是优化。更确切地说,不断的传播。由于a被声明为常量并且初始化为2,因此编译器在调用operator<<(ostream&, int)时会简单地对代码2进行硬编码,因为它会导致比再次读取a的内容更快的代码。

而且它是合法的:由于您调用了未定义的行为,因此编译器可以自由地执行它认为最好的操作。