1. 程式人生 > >C++中cout的使用

C++中cout的使用

cout 是C++中 ostream 型別的物件,該類被封裝在 < iostream > 庫中,該庫定義的名字都在名稱空間 std 中,所以 cout 全稱是 std::cout

1. cout使用的三種方式

前提:如果程式中想使用 cout ,需要包含庫 < iostream >
因為 coutstd 庫中的一個類的物件,所以使用的方法是 std::cout ,如下:

#include <iostream>
int main(){
	int i;
	std::cin >> i;
	std::cout << i <<
std::endl; return 0; }

如果程式中頻繁出現 cout ,這樣的操作極為不便,所以可以使用下面兩種方法來解決。

方法一 :使用 std 名稱空間

#include <iostream>
using namespace std;
int main(){
	int i;
	cin >> i;
	cout << i << endl;
	return 0;
}

這樣,後面程式中可以直接使用 cout ,而且std中的其他名字也可以直接使用,如 cinendl 等。

方法二 :使用 std 名稱空間中的 cout

#include
<iostream>
using namespace std::cout; int main(){ int i; std::cin >> i; cout << i << std::endl; return 0; }

這樣,後面程式中只可以直接使用 cout ,而 std 中的其他名字不可以可以直接使用。

2. cout和i/i++/++i的組合使用

i++++i 是有著不同的含義,和 cout 組合使用也會得到不同的結果,下面給出一段程式碼:

#include <iostream>
using namespace std;
int main(){ int i = 1; cout << ++i << i++ << i << i++ << ++i << endl; return 0; }

這段程式碼的結果是多少呢?
A.23345
B.22335
C.54535
D.53525

我們不妨先理解一下 cout 輸出控制檯的過程。看下面這幅圖:
輸出方式
根據表示式來看, endl 會作為一個可以供 cout 接收的物件往前傳,而 ++iendl 結合起來作為一個可以供 cout 接收的物件往前傳,依次遞推下去。物理實現上需要一個棧來儲存可以供 cout 接收的物件,然後從右向左放到這個棧裡,然後依次彈出輸出在螢幕上。其中, i++i 會在棧裡面儲存 i 的引用,而 i++ 會在棧裡面儲存數字,過程如下:
入棧過程
第一步:將 endl 壓入棧中, i 值不變;
第二步:將 i 的引用壓入棧中, i 的值加 1 變成 2(因為是 ++i );
第三步:將 2 壓入棧中, i 的值加 1 變成 3(因為是 i++ );
第四步:將 i 的引用壓入棧中, i 的值不變(因為是 i );
第五步:將 3 壓入棧中, i 的值加 1 變成 4(因為是 i++ );
第六步:將 i 的引用壓入棧中, i 的值加 1 變成 5(因為是 ++i );
第七步:將棧裡的資料依次彈出,即可得到 53525 。(因為i的值是 5 ,所以所有 i 的引用都是 5

3. 以不同進位制輸出數字

有時候,我們需要以不同的進位制來輸出數字,而預設輸出是十進位制,其他進位制輸出方法如下:

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	int i = 90;
	cout << i << endl;
	cout << dec << i << endl;
	cout << oct << i << endl;
	cout << hex << i << endl;
	cout << setiosflags(ios::uppercase);
	cout << hex << i << endl;
	cout << setbase(8) << i << endl;
}

輸出結果如下:
輸出結果
其中,oct 是八進位制輸出, dec 是十進位制(效果和預設一樣), hex 是十六進位制輸出(字母預設是小寫字母)。這兩個也包含在 std 中,即其全稱分別是 std::octstd::decstd::hex ,這三個控制符包含在庫 < iostream > 中。
setbase(n) 表示以 n 進位制顯示,包含在庫 < iomanip > 中,n 只能取 8, 10, 16 三個值。
setiosflags(ios::uppercase) 表示將字母大寫輸出,包含在庫 < iomanip > 中。
以上均包含在std 名稱空間中。

4. 輸出數字位數的控制

前提:包含庫 < iomanip > ,這個庫包含了對輸入輸出的控制。

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	double i = 3333.1415926;
	cout << i << endl;
	cout << setprecision(3) << i << endl;
	cout << setprecision(9) << i << endl;
	cout << setiosflags(ios::fixed);
	cout << i << endl;
	cout << fixed << setprecision(3) << i << endl;
	cout << setprecision(9) << fixed <<  i << endl;
}

輸出結果如下:
輸出結果
可以看出,C++預設浮點數輸出有效位數是 6 位(若前面整數位數大於 6 位,使用科學計數法輸出),而通過以下幾種方式可以更改輸出精度:
1.使用 setprecision(n) 即可設定浮點數輸出的有效位數
(若前面整數位數大於 n 位,使用科學計數法輸出)
2.使用 setiosflags(ios::fixed)fixed,表示對小數點後面數字的輸出精度進行控制
所以,和 setprecision(n) 結合使用即可設定浮點數小數點後面數字的輸出精度,位數不足的補零
以上均採用 “四捨五入” 的方法控制精度,三個控制符均包含在 std 名稱空間中。

5. 強制顯示小數點和正負號

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	double i = 5, j = -5.2;
	cout << i << '\t' << j << endl;
	cout << setiosflags(ios::showpoint);
	cout << i << '\t' << j << endl;
	cout << setiosflags(ios::showpos);
	cout << i << '\t' << j << endl;
}

輸出結果如下:
輸出結果
顯示預設 6 位有效位數,兩個控制符均包含在庫 < iomanip > 中,std 名稱空間中。

6. 設定寬度和對齊方式

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	cout << "預設顯示:" << endl;
	for (int i = 1; i < 1000; i *= 10){
		cout << setw(8) << i << ':' << setw(8) << i * 10 << endl;
	}
	cout << "左對齊顯示:" << endl;
	for (int i = 1; i < 1000; i *= 10){
		cout << setiosflags(ios::left);
		cout << setw(8) << i << ':' << setw(8) << i * 10 << endl;
	}
	cout << "右對齊顯示:" << endl;
	for (int i = 1; i < 1000; i *= 10){
		cout << setiosflags(ios::right);
		cout << setw(8) << i << ':' << setw(8) << i * 10 << endl;
	}
}

輸出結果如下:
輸出結果
輸出結果預設顯示右對齊。三個控制符均包含在庫 < iomanip > 中,std 名稱空間中。

7. 設定填充字元

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	cout << setfill('*') << setw(8) << 1.22 << endl;
	cout << setfill('*') << setw(8) << endl;
}

輸出結果如下:
輸出結果
控制符包含在庫 < iomanip > 中,std 名稱空間中。

8. iomanip庫用法總結

< iomanip > 庫封裝了很多對輸入輸出流的操作,常見用法總結如下:

控制符 作用
setbase(n) 以n進位制方式輸出(n=8,10,16)
setfill(ch) 設定字元填充,ch可以是字元常量或字元變數
setprecision(n) 設定輸出有效位數為n位
setw(n) 設定字元寬度為n位,只對後一個有影響
setiosflags(ios::uppercase) 以大寫字母顯示
setiosflags(ios::fixed) 實現對小數點後的數字的控制
setiosflags(ios::scientific) 以科學計數法顯示
setiosflags(ios::showpoint) 強制顯示小數點
setiosflags(ios::showpos) 強制顯示正號
setiosflags(ios::left) 設定輸出左對齊
setiosflags(ios::right) 設定輸出右對齊
resetiosflags(…) 終止括號中的輸出格式