2015-10-07 231 views
-5

考慮下面的程序:爲什麼這個C++程序給出錯誤的輸出?

#include <iostream> 
int main() 
{ 
    std::cout<<std::ios::showbase<<123<<", "<<std::hex<<123<<", "<<std::oct<<123<<'\n'; 
} 

預期輸出:123,0x7b,0173

捕捉到的輸出:512123,7B,173(見現場演示這裏:http://ideone.com/Khzj5j

但是如果我修改以上程序如下:

#include <iostream> 
using namespace std; 
int main() 
{ 
    cout<<showbase<<123<<", "<<hex<<123<<", "<<oct<<123<<'\n'; 
} 

現在我得到了期望的輸出。 (請參閱現場演示http://ideone.com/gcuHbm)。

爲什麼第一個程序給出了錯誤的輸出,但第二個程序沒有?第一個程序出了什麼問題?

+7

您使用std :: ios :: showbase的第一個程序,第二個使用std :: showbase的程序。 –

+0

如果要使用I/O操作功能,則應包含標題。 – jaggedSpire

+1

@Downvoters:指定降價的理由。 – Destructor

回答

8

std::ios::showbase是格式標誌。 std::showbase是一個函數,它需要std::ios_base並調用ios_base::setf(std::ios::showbase)來設置showbase標誌。

您在第一個示例中使用了前面的內容,在第二個示例中使用了前者。

2
#include <iostream> 
int main() 
{ 
    std::cout<<std::ios::showbase<<123<<", "<<std::hex<<123<<", "<<std::oct<<123<<'\n'; 
} 

它使用std::ios::showbasehttp://www.cplusplus.com/reference/ios/ios_base/fmtflags/

當你的其他程序

#include <iostream> 
using namespace std; 
int main() 
{ 
    cout<<showbase<<123<<", "<<hex<<123<<", "<<oct<<123<<'\n'; 
} 

用途std::showbasehttp://en.cppreference.com/w/cpp/io/manip/showbase)這就是爲什麼你得到不同的結果。

改變第一程序使用std::showbase向你期望的輸出:

#include <iostream> 
int main() 
{ 
    std::cout<<std::showbase<<123<<", "<<std::hex<<123<<", "<<std::oct<<123<<'\n'; 
} 

http://ideone.com/OodBvo

+1

您提供的鏈接有什麼不同?兩者都導致'std :: showbase' ... –

+1

@AlexLop。修正了,謝謝。 –

1

std::ios_baseshowbasefmtflag具有實現定義的值。在這種情況下,它似乎是512。另一方面,還有一個流操作器(又稱函數),也叫showbase,它調用setf(std::ios_base::showbase)。這在namespace std中被定義爲自由函數,而fmtflagstd::ios_base的成員。

2

std::ios::showbase是一個具有一些實現定義值的格式標誌。當您撥打std::cout << std::ios::showbase時,您正在顯示該值並且未設置流格式標誌。

在你的第二個例子中,你正在使用std::showbase設置流的格式標誌。

相關問題