我试图理解为什么我的程序不会编译,
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'上的操作可能是未定义的。 有人有想法吗?
答案 0 :(得分:5)
myfunction(x) * myfunction(++x)
未定义,因为operator *
的两个参数的评估顺序未指定。因此,可以首先执行第一次或第二次调用,这意味着理论上可以首先评估x
或++x
,这可能导致不同的结果。理论上。在实践中,标准只是责任你不要这样做。
答案 1 :(得分:4)
您正在使用未定义的行为。
无法保证表达式myfunction(x) * myfunction(++x)
以任何特定顺序进行评估,并且由于它具有副作用,因此其行为未定义。
答案 2 :(得分:1)
您的代码使用了“未定义的行为”。
C和C ++标准没有说明(或定义)应评估x
和++x
myfunction(x)
和myfunction(++x)
的顺序。你是否期望结果是121或110(或者完全不是其他的) - 因为这两个值都是完全有效的结果,你是否同样满意这两个结果,或者你认为一个比另一个更“准确”?
编译器警告您,您不能指望此代码生成您可能的结果(可能包括您认为“不可能”)的任何一个,以及不同的编译器(或不同的设置/版本)对于您当前的编译器,可能会产生不同的值。
答案 3 :(得分:0)
++运算符有副作用,使语句未定义。
你可以这样做:
result = myfunction(x) * myfunction(x + 1);
++i; /* or i++ in this case, doesnt matter */
printf("Result is = %d", result)