在 C++ 中列印布林值
- 布林值在 C++ 中為真/假
-
通過在 C++ 中新增三元語句以列印布林值來修改
printf()
-
在
cout
中使用std::boolalpha
在 C++ 中列印布林值 -
使用
std::numpunc
的自定義 Facet 在 C++ 中列印布林值 - まとめ
當我們嘗試在 C++ 中列印布林值時,它們會被 std::cout
列印為 0
或 1
,但有時最好以 true
或 false
的形式檢視輸出。本文介紹如何在 C++ 中以文字形式列印布林值。
布林值在 C++ 中為真/假
假設我們在除錯時通讀了一行又一行的程式碼和日誌檔案,現在在大量錯誤和數字中很容易錯過 0
或 1
。所以最好將布林值列印為 true/false
。
我們將看到實現這一目標的三種不同方法。
通過在 C++ 中新增三元語句以列印布林值來修改 printf()
最簡單的方法是在 printf()
中稍作修改,可以列印 true
或 false
。使用 printf()
列印 bool 時,我們必須使用格式為 %d
,因為 bool 值沒有特定引數。
由於 bool 比 int
短,因此當在 printf()
語句中傳遞時,它被提升為 int
。但這會列印普通的舊 0
和 1
,因此我們通過新增三元 if-statement
並將格式說明符更改為%s
來進行修改,我們得到我們想要的 true
或 false
輸出。
示例程式碼:
#include <iostream>
using namespace std;
int main() {
printf("boolean true: %d\n", true);
printf("boolean false: %d\n", false);
// modified printf()
printf("boolean true: %s\n", true ? "true" : "false");
printf("boolean false: %s\n", false ? "true" : "false");
}
輸出:
boolean true: 1
boolean false: 0
boolean true: true
boolean false: false
這種方法的問題是,當原始碼檔案變得大而複雜時,它會妨礙可讀性。
在 cout
中使用 std::boolalpha
在 C++ 中列印布林值
std::boolalpha
可以在 <iomanip>
標頭檔案中找到,它適用於輸入和輸出流函式。標準流有一個 boolalpha
標誌,它決定了在螢幕上列印的內容。
如果它設定為 true
,它會顯示布林值的文字形式,即 true
或 false
,但是當它設定為 false
時,我們得到的布林輸出僅為 0
和 1
。
例子:
#include <iostream>
using namespace std;
int main() {
cout << "when boolalpha flag is off\n";
cout << "true: " << true << endl;
cout << "false: " << false << endl;
cout << "when boolalpha flag is on\n";
cout << boolalpha << "true: " << true << endl;
cout << boolalpha << "false: " << false << endl;
cout << noboolalpha;
}
輸出:
when boolalpha flag is off
true: 1
false: 0
when boolalpha flag is on
true: true
false: false
std::boolalpha
是列印 true
或 false
作為輸出的最佳方法之一,但它有一些缺點。首先,我們應該在通過 std::noboolalpha
使用後關閉 boolalpha
標誌。
另一個問題是,如果我們想用日語或其他語言編寫程式碼,並且我們確實想要列印"hai"
(日語中為真)或"nai"
(日語中為假)而不是 true
或 false,該怎麼辦?
,或者如果我們想將單詞大寫為 True
或 False
,我們不能單獨使用 std::boolalpha
來做任何這些。
使用 std::numpunc
的自定義 Facet 在 C++ 中列印布林值
如上一段所述,如果我們想要列印除 true
或 false
或大寫或本地化輸出之外的內容怎麼辦。這可以使用 std::numpunct
的自定義 facet
來完成。
facet
是描述與特定文化方面相關的語言環境特徵集的類。流輸入和輸出操作使用 std::numpunct
到 std::numget
和 std::numput
來解析數字輸入和格式化數字輸出。
std::numpunct
的 facet
封裝了數字標點首選項。我們可以通過覆蓋 std::numpunct
中的函式 do_truename()
和 do_falsename()
來指定我們想要在 std::boolalpha
標誌處於活動狀態時返回的字串。
在此之後,使用 std::locale
物件以及使用 std::cout.imbue()
我們可以替換當前的語言環境。
示例程式碼:
#include <ios>
#include <iostream>
#include <locale>
using namespace std;
class japanese_bool : public std::numpunct<char> {
protected:
std::string do_truename() const override { return "Hai"; }
std::string do_falsename() const override { return "NAI"; }
};
int main() {
cout.imbue(std::locale(std::locale(), new japanese_bool));
cout << std::boolalpha;
cout << "Japanese true : " << true << "\n";
cout << "Japanese false : " << false << "\n";
cout << noboolalpha;
}
在上面的程式碼中,new
不是記憶體洩漏,japanese_bool
物件是隱式引用計數的,當 std::locale
引用超出範圍時,它會自動銷燬。
輸出:
Japanese true : Hai
Japanese false : NAI
まとめ
這篇文章教給我們不同的方法來列印布林輸出為 true
和 false
。如果我們想要 true
或 false
作為輸出,前兩種方法更可取,而當我們想要一些專門的輸出而不僅僅是真或假時,第三種方法是首選。