if((float)(int_one&& int_two)==(float)int_one&&(float)int_two)总是评估" false"

时间:2014-06-15 14:51:22

标签: c

这是在CC模式下用GCC编译的。

我正在查看一些基本的解释器代码,并在解析" AND"时运行此代码。运营商。 int_one和int_two是AND的参数的整数值,如下所示:

int_one AND int_two

这部分解释器已经确定参数是整数类型(而不是实数类型),那么为什么我们关心它们在作为实数转换时如何比较?

我不能100%确定这项检查的作用,而且,为什么它几乎总是评估为假!这项检查有什么意义,为什么它是错误的呢?

以下是一些测试人员代码,说明了缓冲和结果的一些可能错误的假设,这会产生不同的结果:

#include <stdio.h>
#include <stdlib.h>

int one, two;
int main()
{

    // Initialize
    one = 3;
    two = 3;

    // do a test with buffering the and result
    float int_and_cast_to_real = (float)(one && two);
    float int_cast_to_real_and = (float)one && (float)two;

    if (int_and_cast_to_real == int_cast_to_real_and) {
        // This message gets fired, so the buffered results are true.
        printf("oh they are equal buddy\n");
    } else {
        printf("you think they'd be equal, but they aint.\n");
    }

    // do it all at once
    if((float)(one && two) == (float)one && (float)two) {
        printf("int & real ands give equal result\n");
    } else {
        // This message gets fired, so the unbuffered results are false.
        printf("int & real ands give inequal result\n");
    }


    return 0;
}

2 个答案:

答案 0 :(得分:4)

是。因为布尔值是01(one && two);会返回布尔1,在转换为float后会1.000000,而(float)one将返回3.000000

因此,(float)(one && two) == (float)one && (float)two将被评估为( (float)(one && two) == (float)one ) && (float)two(因为==的优先级高于&&),这会使0.000000 == 1.000000最终评估为false 1}}。

答案 1 :(得分:1)

(float)(one && two) == (float)one && (float)two条件评估为((float)(one && two) == (float)one) && (float)two,但您的意图似乎是(float)(one && two) == ((float)one && (float)two)