我试图理解为什么我的程序无法编译,
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'上的操作可能未定义。有人有想法吗?
我试图理解为什么我的程序无法编译,
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'上的操作可能未定义。有人有想法吗?
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.
您正在使用未定义的行为。
无法保证表达式myfunction(x) * myfunction(++x)
以任何特定顺序进行计算,并且由于它具有副作用,因此它的行为是未定义的。
您的代码使用了“未定义的行为”。
C和C++ 标准没有说明(或定义)应以何种顺序x
进行评估。您是否期望结果为 121 或 110(或完全是其他值) - 因为这两个值都是完全有效的结果,您是否会同样高兴获得这两个结果,或者您认为一个比另一个“更准确”?++x
myfunction(x)
myfunction(++x)
编译器警告您,您不能期望此代码产生您喜欢的可能结果(其中可能包括您认为“不可能”的结果)和不同的编译器(或您当前的不同设置/版本)编译器)可能会导致不同的值。
++ 运算符具有使语句未定义的副作用。
你可以这样做:
result = myfunction(x) * myfunction(x + 1);
++i; /* or i++ in this case, doesnt matter */
printf("Result is = %d", result)