在 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 作為輸出,前兩種方法更可取,而當我們想要一些專門的輸出而不僅僅是真或假時,第三種方法是首選。
