C-代码::Blocks 13.12:哪一个可以很好地工作,或者两者都可以?两者之间有区别吗?或者在C标准中是允许的?

C-代码::Blocks 13.12:哪一个可以很好地工作,或者两者都可以?两者之间有区别吗?或者在C标准中是允许的?,c,casting,increment,C,Casting,Increment,例1: while(npw(x,i)/ftr(i)>0.00001) { t+=npw(x,i)/ftr(i); i++; //normal increase i } 或 示例2:(x是一个“浮点型”) 或 t+=npw(x,i++)/ftr(i++) 可能不会执行您希望它执行的任何操作,因为两个增量操作的执行顺序未指定。也就是说,您不知道哪个函数将获得递增的I,哪个函数将获得递增的I作为参数 此外,无论哪个i先递增,它都将与前一段代码完全不

例1:

while(npw(x,i)/ftr(i)>0.00001) {
  t+=npw(x,i)/ftr(i);
  i++;                    //normal increase i
}

示例2:(x是一个“浮点型”)

t+=npw(x,i++)/ftr(i++)

可能不会执行您希望它执行的任何操作,因为两个增量操作的执行顺序未指定。也就是说,您不知道哪个函数将获得递增的
I
,哪个函数将获得递增的
I
作为参数

此外,无论哪个
i
先递增,它都将与前一段代码完全不同,
i
只递增一次


其他例子看起来是正确的。最后两段代码仅在语义上不同。

在示例1中,代码片段甚至不完全相同。撇开顺序的缺失(因此UB)不谈,第二种情况下增加两次,第一种情况下只增加一次。关于示例1,一个表达式中的两个增量是未指定的行为。更担心的是编写正确的代码,而不是尝试编写巧妙的代码。在第一个示例中,函数
npw()
ftr()
在循环中使用相同的参数调用了两次。最后一个例子建议
ftr()
计算阶乘,因此计算成本会很高。[叹气]更多的“代码会让你的屁股被炒鱿鱼”。
while(npw(x,i)/ftr(i)>0.00001)
  t+=npw(x,i++)/ftr(i++); //increase i inside function's parameters
int n=(int)x;                     //normal cast
printf("x! = %.0lf\n",ftr(n));
printf("x! = %.0lf\n",ftr((int)x)); //directly cast inside function parameters