bugfix> c++ > 投稿
while ((choice != "Wizard") && (choice != "Knight"))

これが働いた唯一のものです

while ((choice != "Wizard") || (choice != "Knight"))
while (choice != "Wizard" || "Knight")

正直なところ、ORを使用しても機能しない理由と、ORを使用した場合の違いはわかりません。誰かが説明を手伝ってくれることを願っています。

回答 2 件
  • 文字列 "Wizard" を取得します :

    "Wizard" とは異なりますか ?番号。

    rom "Knight" は違いますか ?はい。

    したがって、「ウィザードとは異なり、ナイトとは異なる」は偽です(「ウィザード」とは異なりません)。ただし、「ウィザードとは異なる、またはナイトとは異なる」は正しい(「ナイト」とは異なる)。

    3番目の形式については、 choice != "Wizard" || "Knight"   (choice != "Wizard") || "Knight" として解析されます 。 "Knight"  文字列リテラルであるため、ほとんどの式で非ヌルポインターに減衰します。ヌルではないため、ポインターは true に変換されます 。だからあなたは効果的に尋ねています: " choice   "Wizard" とは異なります  OR true。」それはもちろん常に真実です。

  • (choice != "...") && の増え続けるチェーンの代替として 代わりに、テストするもののコンテナを作成し、選択がそのコンテナの要素であるかどうかを確認できます。

    static const std::unordered_set<std::string> options = {
        "Wizard", 
        "Knight", 
        "Rogue", 
        "Basket Weaver", 
    };
    while (options.count(choice) == 0)
    
    

あなたの答え