从double隐式转换为int?

时间:2019-04-13 08:23:53

标签: c

// Assuming these initializations
int x; 
float y;

这有什么区别?

  x = y = 7.5;

这:

  y = x = 7.5;

第一个如何将y的值打印为7.5, 第二个将y打印为7.00

3 个答案:

答案 0 :(得分:8)

解释非常简单:=是从右到左的关联,这意味着x = y = 7.5;被评估为x = (y = 7.5);,因此与以下内容相同:

y = 7.5;   // value is converted from double to float, y receives 7.5F
x = y;     // value of y is converted from float to int, x receives 7 (truncated toward 0)

y = x = 7.5;被评估为y = (x = 7.5);

x = 7.5;   // 7.5 is converted to int, x receives value 7 (truncated toward 0)
y = x;     // value of x is converted to float, y receives 7.0F

这些隐式转换可能很直观。您可能希望提高警告级别,以使编译器警告您潜在的错误和不良的副作用。

答案 1 :(得分:4)

如右图所示,分配链从右到左进行评估。

x = y = 7.5;

相同
x = (y = 7.5);

此外,分配的结果是分配的值。 这意味着7.5(类型double)被隐式转换为float,然后分配给y。然后将结果(7.5f分配给x。在此分配期间,该值将强制转换为int,结果为7,该结果存储在x中。

如果您切换顺序,则会得到不同的类型:

y = x = 7.5;

现在7.5(类型double)隐式转换为int,然后分配给x。结果是7,它被分配给y。现在,该值已强制转换为double,但小数部分已经丢失,您将把7.0f存储在y中。

答案 2 :(得分:2)

第二个表达式

y = x = 7.5; /* multiple assignment operator. R->L associativity */

x = 7.5首先求值,然后您将实数浮点值7.5分配给整数x,导致小数部分被截断,因此x被分配了{{ 1}}而不是7,随后在7.5上分配了y

C99 标准节6.3.1.4实数浮点数和整数

  

实浮点型的有限值转换为   除_Bool之外的整数类型小数部分将被丢弃(即,该值将被截断为零)。如果值   整数类型不能代表整数部分   行为是未定义