2

我试图理解为什么我的程序无法编译,

int myfunction(int x)
{
   return x;
} 

int main(){
  int x = 10;
  int result=0;
  result=myfunction(x) * myfunction(++x);
  printf("Result is = %d", result);
}

执行后我得到:警告被视为错误函数'int main()':'x'上的操作可能未定义。有人有想法吗?

4

4 回答 4

5

myfunction(x) * myfunction(++x) is undefined because the order of evaluation of the two arguments to operator * is unspecified. So either the first or second call can be executed first, meaning that theoretically x or ++x can be evaluated first, which can lead to different results. Theoretically. In practice, the standard just passes responsibility to you not to do this.

于 2013-06-17T12:12:51.423 回答
4

您正在使用未定义的行为。

无法保证表达式myfunction(x) * myfunction(++x)以任何特定顺序进行计算,并且由于它具有副作用,因此它的行为是未定义的。

于 2013-06-17T12:12:35.333 回答
1

您的代码使用了“未定义的行为”。

C和C++ 标准没有说明(或定义)应以何种顺序x进行评估。您是否期望结果为 121 或 110(或完全是其他值) - 因为这两个值都是完全有效的结果,您是否会同样高兴获得这两个结果,或者您认为一个比另一个“更准确”?++x myfunction(x)myfunction(++x)

编译器警告您,您不能期望此代码产生您喜欢的可能结果(其中可能包括您认为“不可能”的结果)和不同的编译器(或您当前的不同设置/版本)编译器)可能会导致不同的值。

于 2013-06-17T12:15:45.640 回答
0

++ 运算符具有使语句未定义的副作用。

你可以这样做:

    result = myfunction(x) * myfunction(x + 1);

    ++i; /* or i++ in this case, doesnt matter */

    printf("Result is = %d", result)
于 2013-06-17T12:27:35.967 回答