2012-04-03 13 views
6

Kodumdaki bazı iddialar garip davranmaya başladı ve daha önce benzer bir durumun olup olmadığını merak ettim. gibi bir kısa kod parçacığı:Garip, mantıksal ve bool değişkenleri üzerinde başarısızlığı önler

#include <cassert> 

class A{ 
    protected: 
     bool isM, isN; 

    public: 
     void someFunction(); 
}; 

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

    ... 
} 

bir assertion failed sonucu verir. Öte yandan, sadece hafifçe kodu değiştirdikten sonra:

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

    ... 
} 

iddialar hiçbir sorun ve fonksiyonu ile geçmesi normal bitirir. bool değişkenleri, someFunction() gerçek çağrısından önce ayarlandığından, işlev sonlandırması normal olarak beklenen işlevselliktir.

Başka bir soru olarak, C++'da iddiaların daha iyi bir yolu var mı? C üzerinde büyüdüm ve hala C tarzı iddiaları kullanıyorum. Bunun üzerine Google yüzeyini çizdim, ancak yeni bir şey olduğuna dair hiçbir şey bulamadım.

Gerekirse, sorunlu durumu tanımak için yeterli değilse, sınıf ve değişkenler için daha fazla bağlam sağlayabiliriz. bool değişkenleri aslında bir alt sınıfın örneğinde ayarlanırken, someFunction, arabiriminde uygulanan nadir işlevlerden biridir, ancak bu sorunu karmaşık hale getirdiğinden, yalnızca topluluk bunu uygun buluyorsa onu daha ayrıntılı olarak düzenleyeceğim.

+0

'bool' değişkenlerinin' someFunction() 'çağrısından önce ayarlandığını mı söylüyorsunuz? – juanchopanza

+0

Bools ayarlandı mı, değil mi? – dexametason

+0

C++ 11, derleme zamanı onaylaması olan "static_assert" öğesini getiriyor. Sanırım önceki C++ sürümleri için de kullanılabilir. – RedX

cevap

3

Boole'ler başlatılmamış. Herhangi bir değer alabilirler. Buradaki davranış tanımlanmamıştır.

#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"; 

} 

bu çıktı üretir: ubuntu 11.10 bir gcc 4.7 anlık kullanılarak, bu Örnek olarak

121, 0 
244, 31 

veya -O3 ile optimize tekrar

192, 0 
244, 127 

çalışan ya da bir sıfırlar demet.

+0

Oraya yerleştirdiğiniz çıkış parçacıkları arasındaki fark nedir? – penelope

+0

@penelope Sadece programı iki kez çalıştırdım. – juanchopanza

+0

ah :) tamamen aynılar. Bu – penelope