bool変数がtrueではなく、同時にfalseではない場合

私たちは最近コードを読んで、このような何かに出くわしました。



bool *t = new bool[X][Y]; //   switch (t[M][N]) { case true: //   break; case false: //   break; default: //   break; }
      
      





すぐに問題が発生します。なぜデフォルトのブランチが必要なのですか? 変数が真でない場合、偽です。 仲間の学生が言った:「デバッグのために。」 私は思う:ここで何をデバッグできますか? しかし、それほど単純ではありません。



私はそれを始めています。 コードはデフォルトのブランチで実行されます。 最初の仮定-休憩を置くのを忘れた。 私は慎重にコードを読み直しました-すべてが順調です。 デバッガで実行すると、デフォルトのブランチがすぐに実行され、trueブランチまたはfalseブランチも入力されないことがわかります。 変数の値を表示することにしました。 Windows 7で実行されているVisual Studio 2012には205が表示されます。たとえば。 私は最近プロを学び始めたので、ちょっとした実験をすることにしました。ブール変数を作成して205を割り当てました。真のブランチは機能します。 この問題について考えていたときに、仲間の学生がこの問題の解決策を見つけました。配列が初期化されていないことがわかりました。 初期化後、問題はなくなりました。 今、私は質問があります:スイッチに本当に問題がありますか? 検証のために、次の実験を行うことにしました。



 #include <iostream> using namespace std; int main() { bool *t = new bool[1]; switch (t[0]) { case true: cout << "true\n"; break; case false: cout << "false\n"; break; default: cout << "superposition\n"; break; } if(t[0] == true) { cout << "true\n"; } else if(t[0] == false) { cout << "false\n"; } else { cout << "superposition\n"; } if(t[0]) { cout << "true\n"; } else if(!t[0]) { cout << "false\n"; } else { cout << "superposition\n"; } delete[] t; return 0; }
      
      





スイッチ付きのバリアントまたはif付きの最初のバリアントでは、初期化されていないブール変数を定義できます。 ifを持つ2番目のオプションは、3番目のオプションには決して入りません。



このようなシュレディンガー変数を作成する方法は? 動的配列または静的配列を作成します。 初期化する前に使用してください。 また、最も不思議なのは、この不定の値をスカラー変数にでもコピーできることです。 これが便利になるのはあなた次第です。



また、チェックする前に挿入する場合も興味深いです:



 char a = t[0]; t[0] = a;
      
      



その後、変数は最終的にtrueになります。 そして、あなたが書くなら

 bool a = t[0]; t[0] = a;
      
      







その後、何も変わりません。



その後、Windows 7で実行されているService Pack 5を使用してVisual Studio 2013で実験を繰り返しました。そこで、デバッガーは初期化されていない変数がtrueであると言いますが、それにもかかわらず、trueブロックを入力しません。 彼女はまた、すべての可能なラベルがすでに設定されているため、デフォルトのブランチは必要ないと言います。 しかし、これにもかかわらず、デフォルトのブロックに入ります。



Linuxでは、この機能は発生しません。



All Articles