在 C++ 中列印布林值

Suraj P 2023年10月12日
  1. 布林值在 C++ 中為真/假
  2. 通過在 C++ 中新增三元語句以列印布林值來修改 printf()
  3. cout 中使用 std::boolalpha 在 C++ 中列印布林值
  4. 使用 std::numpunc 的自定義 Facet 在 C++ 中列印布林值
  5. まとめ
在 C++ 中列印布林值

當我們嘗試在 C++ 中列印布林值時,它們會被 std::cout 列印為 01,但有時最好以 truefalse 的形式檢視輸出。本文介紹如何在 C++ 中以文字形式列印布林值。

布林值在 C++ 中為真/假

假設我們在除錯時通讀了一行又一行的程式碼和日誌檔案,現在在大量錯誤和數字中很容易錯過 01。所以最好將布林值列印為 true/false

我們將看到實現這一目標的三種不同方法。

通過在 C++ 中新增三元語句以列印布林值來修改 printf()

最簡單的方法是在 printf() 中稍作修改,可以列印 truefalse。使用 printf() 列印 bool 時,我們必須使用格式為 %d,因為 bool 值沒有特定引數。

由於 bool 比 int 短,因此當在 printf() 語句中傳遞時,它被提升為 int。但這會列印普通的舊 01,因此我們通過新增三元 if-statement 並將格式說明符更改為%s 來進行修改,我們得到我們想要的 truefalse 輸出。

示例程式碼:

#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,它會顯示布林值的文字形式,即 truefalse,但是當它設定為 false 時,我們得到的布林輸出僅為 01

例子:

#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 是列印 truefalse 作為輸出的最佳方法之一,但它有一些缺點。首先,我們應該在通過 std::noboolalpha 使用後關閉 boolalpha 標誌。

另一個問題是,如果我們想用日語或其他語言編寫程式碼,並且我們確實想要列印"hai"(日語中為真)或"nai"(日語中為假)而不是 truefalse,該怎麼辦? ,或者如果我們想將單詞大寫為 TrueFalse,我們不能單獨使用 std::boolalpha 來做任何這些。

使用 std::numpunc 的自定義 Facet 在 C++ 中列印布林值

如上一段所述,如果我們想要列印除 truefalse 或大寫或本地化輸出之外的內容怎麼辦。這可以使用 std::numpunct 的自定義 facet 來完成。

facet 是描述與特定文化方面相關的語言環境特徵集的類。流輸入和輸出操作使用 std::numpunctstd::numgetstd::numput 來解析數字輸入和格式化數字輸出。

std::numpunctfacet 封裝了數字標點首選項。我們可以通過覆蓋 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

まとめ

這篇文章教給我們不同的方法來列印布林輸出為 truefalse。如果我們想要 truefalse 作為輸出,前兩種方法更可取,而當我們想要一些專門的輸出而不僅僅是真或假時,第三種方法是首選。

作者: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub