1

在以下代码中:

float x = 0.23;
int z;

z = x;

if (x)
    printf("float %f will not be converted to 0!\n", x);

if (z)
    printf("this will not print!\n");

我认为浮点数将转换为整数,然后在if语句中使用时检查它是否为零。有人可以向我解释一下,为什么不是这样?

编辑:

(只是为了澄清让我感到困惑的事情)由于像<return这样的逻辑运算符int,我认为该if语句接收整数值,因此需要进行转换。正如答案所指出的那样,事实并非如此。谢谢大家!

4

5 回答 5

5

我认为浮点数将转换为整数,然后在 if 语句中使用时检查它是否为零。

不,它只会与零进行比较。C++11 4.12 中给出了将算术类型转换为布尔值的规则:

零值 [...] 转换为false; 任何其他值都转换为true.

于 2013-02-21T10:58:38.943 回答
4
  1. 与其他类型操作时会发生类型转换,整数在它们之间操作时会转换为float,例如:x + z // z 会先转换为“float”,然后再与“x”相加
  2. 如果在“if()”中用作逻辑条件,则只判断“null/zero or not”。0.23 不是零/空,因此结果为 TRUE。
于 2013-02-21T11:13:22.330 回答
2

编译器只会检查参数if是否为zero. 如果不是,则条件为true。根本没有进行任何转换。

于 2013-02-21T10:31:58.997 回答
1

您的第一个测试是 testing xfloat所以没有“转换”发生在那里。

基本上,if将检查表达式是 0 还是非零,并且显然 0.23 是非零的,因此代码应该执行。

你可以想到

if(x)

一样

if(x != 0)
于 2013-02-21T10:32:48.100 回答
1

如果在布尔上下文中使用浮点数,将直接检查它是否为零,而无需先将其转换为 int。如此0.23ftrue虽然(int)0.23f如此false

于 2013-02-21T10:33:04.687 回答