首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有人说 这是 cout 的有关问题

2012-07-29 
有人说 这是 cout 的问题C/C++ codecout Lhello world !endlcout hello world !endl汇编:

有人说 这是 cout 的问题

C/C++ code
    cout << L"hello world !"<<endl;    cout << "hello world !"<<endl;


汇编:
C/C++ code
cout << L"hello world !"<<endl;0041456E  mov         esi,esp  00414570  mov         eax,dword ptr [__imp_std::endl (41A330h)]  00414575  push        eax  00414576  mov         edi,esp  00414578  push        offset string L"hello world !" (417874h)  0041457D  mov         ecx,dword ptr [__imp_std::cout (41A334h)]  00414583  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A344h)]  00414589  cmp         edi,esp  0041458B  call        @ILT+430(__RTC_CheckEsp) (4111B3h)  00414590  mov         ecx,eax  00414592  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A33Ch)]  00414598  cmp         esi,esp  0041459A  call        @ILT+430(__RTC_CheckEsp) (4111B3h)      cout << "hello world !"<<endl;0041459F  mov         esi,esp  004145A1  mov         eax,dword ptr [__imp_std::endl (41A330h)]  004145A6  push        eax  004145A7  push        offset string "hello world !" (417864h)  004145AC  mov         ecx,dword ptr [__imp_std::cout (41A334h)]  004145B2  push        ecx  004145B3  call        std::operator<<<std::char_traits<char> > (411163h)  004145B8  add         esp,8  004145BB  mov         ecx,eax  004145BD  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (41A33Ch)]  004145C3  cmp         esi,esp  004145C5  call        @ILT+430(__RTC_CheckEsp) (4111B3h)  



输出:
00417847
hello world !


为啥 一个地址,一个字符串?

[解决办法]
cout不支持宽字符
[解决办法]
cout不支持宽字符的输出,输出宽字符用wcout。
[解决办法]
探讨

cout不支持宽字符

[解决办法]
wcout << L"hello world !"<<endl;
 cout << "hello world !"<<endl;

[解决办法]
cout 不支持宽字符.
[解决办法]
cout << "hello world !"<<endl;
编译器将"hello world !"解析为const char*,调用cout的"<<"操作符的operator<<(const char*)版本

cout << L"hello world !"<<endl;
编译器将L"hello world !"解析为const wchar_t*,而cout的"<<"操作符没有operator<<(const wchar_t*)版本,而存在operator<<(const void*)版本,由于const wchar_t*可默认转换为const void*,根据重载规则,编译器会选择operator<<(const void*)版本,而operator<<(const void*)版本的实现是将指针地址值输出到cout

热点排行