我对以下代码片段有疑问
float func(float x, float y)
{
return x*0.5 + y;
}
int main()
{
float x = 0.5;
if (x = func(x, x++))
{
printf("%f\n", x);
}
}
Run Code Online (Sandbox Code Playgroud)
上面代码的答案是1.250000.在函数调用中,x ++表示0.5 ++.函数传递1.0到x ++参数.我想知道0.5 ++是什么意思?为什么它再添加0.5而不是添加1.0?请帮我
(x = func(x, x++))
Run Code Online (Sandbox Code Playgroud)
这个展览的未定义行为.因为您倾向于x在单个执行行中更改多次值.
按照标准
C99§6.5:"2.在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该是只读的,以确定要存储的值."
除此之外-
正如你在评论中提到的那样会是x++;什么?
作为++增量值1,因此表达式x++;将产生你1.5.
6.5节:C99标准中的2点说:
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该只读以确定要存储的值.
函数参数的评估之间没有序列点,因此func(x, x++)打破此规则,因此其行为未定义.
关于0.5++,该表达式是非法的,因为它等同于0.5 += 1,并且幸运的是你不能分配给常量.但是,以下代码:
float x = 0.5f;
x++;
printf("%f", x);
Run Code Online (Sandbox Code Playgroud)
相当于
float x = 0.5f;
x += 1;
printf("%f", x);
Run Code Online (Sandbox Code Playgroud)
并将1.500000按预期打印.