这是在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;
}
答案 0 :(得分:4)
是。因为布尔值是0
或1
。 (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)
。