为什么这个条件返回false,但是在main函数中它返回true?

时间:2016-02-05 01:15:35

标签: c++ logic

所以我在C ++学习模板,我有这个模板课," Test.h ":

#ifndef TEST_H
#define TEST_H

#include <cassert>
#include <iostream>
#include <cmath>    // for std::abs

template<unsigned int DIM> class Test
{
private:
    double abs_error = 1e-6;
    double mData[DIM];

public:
    double& operator[](int index)
    {
        // To check that the input index is a valid one
        assert(index < DIM);
        assert(index > -1);

        // Condition that checks for values between 0 and 1 inclusive
        if (mData[index] >= 0.0 && mData[index] <= 1.0)
        {
            return mData[index];
        }

        // Values less than zero
        else if (std::abs(mData[index]) <= abs_error && mData[index] <= 0.0)
        {
            return mData[index] = 0;
        }

        // Values more than one
        else if (mData[index] >= 1.0 && std::abs(mData[index] - 1.0) <= abs_error)
        {
            std::cout << "You used this condition." << std::endl;
            return mData[index] = 1;
        }

        // For every other possible value
        else
        {
            assert(0);
        }

        return mData[index];

    }



};


#endif //TEST_H

技术上检查分配给数组中特定索引的值。我想要它做的是,如果数字介于0和0.000001之间,我希望它为该特定索引返回0。如果数字介于1和1.000001之间,我希望它将分配给该特定索引的值更改为1.如果该数字小于零或大于1,我希望它引发一个断言语句,例如,如果存储在数组的特定索引中的值是2或-0.3。

所以,我在一个主文件中测试了它: &#34;的的main.cpp &#34;

#include <iostream>
#include <cmath>
#include "Test.h"

int main()
{
    Test<6> p;
    p[0] = 0.5;
    std::cout << "p[0]: " << p[0] << std::endl;
    p[1] = -1e-7;
    std::cout << "p[1]: " << p[1] << std::end;
    // Comment the following two lines and check the test statement
    p[2] = 1+1e-8;
    std::cout << "p[2]: " << p[2] << std::endl;

    // This code tests the same condition as in Test.h for 
    // values more than one
    bool foo = 1+1e-8 >= 1.0 && std::abs(1+1e-8 - 1.0) <= 1e-6;
    std::cout << "foo (should return 1): " << foo << std::endl;

    return 0;
}

所以,在&#34; main.cpp &#34; file,第一个值是0.5,因此它检查为true,因为它介于0和1之间。

下一个也返回true,因为它介于0和0.000001之间,所以它被赋值为0并应在屏幕上打印。

但是第三个提出了断言,但是如果你对该部分进行注释并将测试语句保留在文件的底部,它将返回true,即使它具有相同的逻辑条件。

我的问题是,我在这里做错了什么?

编辑:如果我在Linux Ubuntu 14.06中编译它不会工作,但是如果我在OS X Yosemite中编译它就可以了。

1 个答案:

答案 0 :(得分:2)

问题可能是您没有初始化值。

这样的行
Thread t1 = new Thread ( () => {

    AutoResetEvent keepMeAlive = new AutoResetEvent( False );

    webBrowser1.DocumentComplete += (s , e) => {
        //Do Some Stuff

        keepMeAlive.set();
    };

    webBrowser1.Navigate("www.google.com");

    Thread keepAlive = new Thread ( () =>{
        keepMeAlive.WaitOne();
    });
    keepAlive.Start();
});

也拨打p[0] = 0.5; 。但是,当第一次分配一个值时,结果已经取决于你记忆中的内容。如果小于double& operator[]一切都很好,如果没有,则会提升1+abs_error

因此,您应该使用至少不会引发断言的内容来初始化数组,例如: {0}