1

一个小测试程序:

#include <iostream>


const float TEST_FLOAT = 1/60;

const float TEST_A = 1;
const float TEST_B = 60;
const float TEST_C = TEST_A / TEST_B;

int main()
{
 std::cout << TEST_FLOAT << std::endl;
 std::cout << TEST_C << std::endl;

 std::cin.ignore();
 return 0;
}

结果 :

0
0.0166667

在 Visual Studio 2008 和 2010 上测试。

  1. 我曾在其他编译器上工作过,如果我没记错的话,第一个结果就像第二个结果一样。现在我的记忆可能是错误的,但 TEST_FLOAT 的值不应该与 TEST_C 相同吗?如果不是,为什么?
  2. TEST_C 值是在编译时还是在运行时解析的?我总是假设前者,但现在我看到这些结果我有些怀疑......
4

1 回答 1

11

1/60

两个操作数都是整数,因此执行整数运算。要执行浮点运算,至少有一个操作数需要具有浮点类型。例如,以下任何一个都将执行浮点除法:

1.0/60
1.0/60.0
1/60.0

(您可以选择1.0f改用,以避免任何精度降低警告;1.0has type double, while 1.0fhas type float

不应该TEST_FLOAT有相同的价值TEST_C吗?

在这种TEST_FLOAT情况下,执行整数除法,然后将整数除法的结果转换为float赋值中。

在这种TEST_C情况下,整数文字1and在分配给时60转换为and ; 然后对这些浮点数执行浮点除法,并将结果分配给.floatTEST_ATEST_BTEST_C

值是TEST_C在编译时还是在运行时解析的?

这取决于编译器;任何一种方法都符合标准。

于 2010-06-06T23:18:24.233 回答