2012-04-03 10 views
6

私のコードの中には、奇妙な動作を開始したばかりのものがいくつかありました。以下のような短いコードスニペット:奇妙なassertが論理変数とbool変数に失敗する

#include <cassert> 

class A{ 
    protected: 
     bool isM, isN; 

    public: 
     void someFunction(); 
}; 

A::someFunction(){ 
    assert (this->isM && this->isN); 

    ... 
} 

assertion failed結果を生成します。一方、わずかにコードを変更した後:

A::someFunction(){ 
    assert(this->isM); 
    assert(this->isN); 

    ... 
} 

アサーションは問題なく通過し、機能は正常に終了します。実際に呼び出す前にboolの変数が設定されているので、機能の正常終了は期待される機能です。someFunction()

追加の質問として、C++でアサーションを実行するより良い方法がありますか?私はCで成長しましたが、Cスタイルのアサーションを使っています。私はちょうどこれにGoogleの表面を傷つけたが、何も新しいことを暗示するものは何も見つかりませんでした。

問題のある状況を誰かが認識できない場合は、必要に応じて、クラスと変数のコンテキストを増やすことができます。 boolの変数はサブクラスのインスタンスで実際に設定されますが、someFunctionclass Aインターフェイスで実装される珍しい機能の1つですが、これは疑問を複雑にしているため、コミュニティが適切と考える場合にのみ詳細に編集します。

+0

あなたは 'someFunction()'の呼び出しの前に 'bool'変数が設定されているのでしょうか? – juanchopanza

+0

ブールはセットされていますか? – dexametason

+0

C++ 11は 'static_assert'を返します。これはコンパイル時のアサーションです。私はそれが以前のC++バージョンのためにも利用可能であると思います。 – RedX

答えて

3

ブール値は初期化されていません。彼らはどんな価値も取ることができます。ここでの動作は未定義です。

#include <iostream> 

struct A { 
    bool a, b; 
}; 

int main() { 

    A a0; 
    std::cout << a0.a << ", " << a0.b << "\n"; 

    A a1; 
    std::cout << a1.a << ", " << a1.b << "\n"; 

} 

この出力生成:Ubuntuの11.10でGCC 4.7スナップショットを使用して、あることを示すために

121, 0 
244, 31 

をまたは、-O3と最適化、再び

192, 0 
244, 127 

を実行したり、ゼロの束。

+0

あなたがそこに置く出力スニペットの違いは何ですか? – penelope

+0

@penelopeプログラムを2回実行しました。 – juanchopanza

+0

ああ:まったく同じです。私は混乱していたと思う。 – penelope

関連する問題