里面的常量变量是什么?
What's a const variable inside?
#include <stdio.h>
int main()
{
const int a=1;
printf("a's address is %prn",&a);
printf("input a's addressrn");
int *p=NULL;
//here let p point to a;
scanf("%p",&p);
printf("p point to %prn",p);
*p=100;
// I suppose a will be 100, but acturlly a is still 1...
printf("a's value is %drn",a);
printf("*p's value is %drn",*p);
return 0;
}
为什么a
仍然1
而不是100
?
但是,如果我声明a
为:
int a =1;
它有效!
那么,情况如何呢?
代码中有几个地方调用未定义的行为,这意味着任何事情都可能发生。 a
可以是1
、100
或"puppy"
。
首先,你不能做
scanf("%p",&p);
printf("p point to %prn",p);
*p=100;
因为你可能不拥有那段记忆。即使你这样做了,写信给它也可能是非法的。这里的情况就是这样。
如果您这样做(更改a
地址处的值)或使用const_cast
,然后尝试修改a
,则存在另一个未定义行为的实例。你许下了承诺a
const
——不要改变它。
结果是 UB,并且发生该行为可能是因为编译器将printf("a's value is %drn",a);
优化为一个简单的printf("a's value is %drn",1);
,因为它相信您不会修改a
(对他来说很丢人)。
当你声明a
为const
时,编译器可以自由地假设它永远不会改变。 您合成指向它的指针并尝试修改它并不重要,因为(显然)您的编译器已经优化了a
的实际加载,当它const
时。
const
关键字指定变量的值是常量,并告诉编译器阻止程序员修改它。
相关文章:
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 存储变量的更有效方法是什么?
- 变量 BitMask 在函数 CeilLog2 中的实际效果是什么?
- 这个变量在 C++ 中的范围是什么?
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 作为副本传递的 std::move()'d 变量的效果是什么?
- 在C++中,变量声明左侧的大括号是什么意思?
- 追问:C++14/C++17 中的变量到底是什么?
- 在多个对象中初始化预定义成员变量的正确方法是什么?
- C++ LibcURL IMAP 获取包含主题行的变量是什么?
- 计算两个uint8_t变量之间差值的最快方法是什么?
- 函数作为变量的语义是什么 C++.
- 使用 std::shared_ptr 接收变量作为引用的利弊是什么?
- 告诉编译器我希望变量始终存储在寄存器中的正确方法是什么
- 在 c++ 中使用右值设置类变量的最有效方法是什么
- 使变量成为常数的重要性是什么?
- 使用与号后跟下划线命名的变量是什么意思?
- 在Visual Studio中生成的匿名命名空间变量的损坏名称的数字部分是什么意思
- 当函数采用右值引用时,函数中该变量的类型是什么?