// Assuming these initializations
int x;
float y;
这有什么区别?
x = y = 7.5;
这:
y = x = 7.5;
第一个如何将y
的值打印为7.5
,
第二个将y
打印为7.00
?
答案 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之外的整数类型,小数部分将被丢弃(即,该值将被截断为零)。如果值 整数类型不能代表整数部分 行为是未定义。