意外的C行为

时间:2013-06-17 12:11:04

标签: c compiler-warnings

我试图理解为什么我的程序不会编译,

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 个答案:

答案 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)