为什么包含未使用的bool类型会影响char类型的引用?
Why does the inclusion of an unused bool affect the reference of a char?
这段代码…
#include <iostream>
int main(int argc, char * argv[])
{
char c = 'A';
std::cout << &c;
return 0;
}
…在Eclipse调试模式和命令行中都正确输出"A"。
然而,当我修改代码…
#include <iostream>
int main(int argc, char * argv[])
{
char c = 'A';
bool b = true;
std::cout << &c;
return 0;
}
…输出"A␁"(拉丁字母'A'后跟'start of header' ASCII控制字符)在Eclipse调试模式和Windows 7命令行上。顺便说一句,当使用bool b = false
时,我没有得到␁性格。
我知道␀值为0,和␁有值1,但为什么cout << &c
受bool的影响?有人能解释一下这是为什么吗?
编辑:忘记添加我的环境:Windows 7 64位,MinGW与g++ 4.5.2,在Eclipse Indigo
在第一个版本中你很幸运。
在第二个程序中,你很幸运(没有崩溃),但它打印了更多的垃圾。
当你使用&在char对象上,你得到一个char*。当你尝试流一个char*时,它的行为不同于所有其他指针(通常打印地址)。但是char*被假定为C-String。C-String是一个以空字符' '结尾的字节序列;
实际发生的是,它从变量'c'开始打印每个内存位置(将其视为字符),并在内存中移动,直到找到字符' '
例子1:
在你的情况下,你很幸运,恰好有一个空字符躺在内存变量'c'之后。
例子2:
在你的情况下,你很幸运,碰巧有一个空字符躺在内存变量'b'之后。但是变量'b'也被解释。
- 当'b'的值为false时:转换为字符,这是' '(同样的事情)。因此,只打印字母"A"。
- 当'b'的值为true:转换为字符时,这是' 1'。不是' ',所以它被打印出来。你很幸运,下一个字节是' ',打印停止。
你真正想做的是:
std::cout << c; // prints a character
或者您可以创建一个字符串:
char const* c = "A"; // Creates a null terminated C-String. Note the double quotes " "
或者获取地址
std::cout << static_cast<void*>(&c); // All other pointer types will print the address
// Of the standard types only char* is treated
// differently with its own overload.
&c
没有传递对c
的引用,它传递的是c
的地址。也就是说,您将char*
传递给operator<<
。该函数将从&c
开始遍历内存,直到找到