int main()
{
volatile int a=26;
volatile int *p=&a;
cout<<p;
return 0;
}
Borland编译器输出为26,gcc O / P为1.为什么?
如果许多变量或大对象被声明为寄存器会发生什么情况,编译器会自动禁止它加载到寄存器上,而是将它们加载到内存中,或者挂起,显示错误等等。 >
谢谢:)
答案 0 :(得分:2)
operator<<(volatile int*)
中的std::ostream
没有重载,因此会考虑隐式类型转换。 volatile
指针不能隐式转换为非volatile
,因此std::ostream::operator<<(void*)
- 通常在指针的情况下使用 - 不是一个选项。但是,类型的重载甚至可以将易失性指针转换为:operator<<(bool)
。由于指针不为空,因此它的转换值为true
,cout
输出为1
。如果您要打印地址,请const_cast
volatile
限定符,以便隐式转换为void*
。如果要打印指向的值,则通过解除引用来传递指向的值而不是指针。
Borland似乎提供了取消引用指针的非标准重载。
无法在C ++中将变量声明为寄存器。是的,有一个register
关键字,但它不会改变程序的含义而已被弃用(计划在c ++ 17版本的标准中删除)。完全由编译器决定变量是存储在存储器中还是仅存储在寄存器中。