什么是0.5 ++的c

Sha*_*nit -4 c

我对以下代码片段有疑问

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?请帮我

ame*_*yCU 7

(x = func(x, x++))
Run Code Online (Sandbox Code Playgroud)

这个展览的未定义行为.因为您倾向于x在单个执行行中更改多次值.

按照标准

C99§6.5:"2.在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该是只读的,以确定要存储的值."

除此之外-

正如你在评论中提到的那样会是x++;什么?

作为++增量值1,因此表达式x++;将产生你1.5.

  • @ user282528希望不会让你在C++中走得更远!:) (2认同)
  • @ user282528未定义的bbehaviour可以给你任何东西.因此它可能会给你正确答案. (2认同)

nem*_*oid 7

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按预期打印.