在函数调用中增加用作数组索引的变量

时间:2014-01-23 14:24:07

标签: c arrays gcc

在C中这可以正常工作

void foo(int a, int b ) { printf("%i,%i ",a,b ); }

int main()
{
  int i=1;
  foo(i++,i);
  foo(i++,i);
  foo(i++,i);
  foo(i++,i);
  return(0);
}

输出:1,2 2,3 3,4 4,5

现在,以下内容不起作用,因为我猜对了:     void foo(int a,int b){printf(“%i,%i”,a,b); }

int main()
{
  int a[] = { 100,200,300,400,500,600,700 };
  int i=0;
  foo(a[i++],a[i]);
  foo(a[i++],a[i]);
  foo(a[i++],a[i]);
  foo(a[i++],a[i]);
  return(0);
}

它返回 100,100 200,200 300,300 400,400

按照上一个例子的逻辑,我原以为 100,200 200,300 300,400 400,500

我的第一个怀疑是增量仅在函数调用之后调用,但是,正如第一个示例所示,i确实在函数调用内增加,除非它被用作数组的索引。

我也尝试使用foo(*(a +(sizeof(int) i ++)),(a +(sizeof(int)* i)));只是为了检查,它也像第二个例子。

编译器是gcc版本4.6.3

我的问题是,为什么当我直接使用变量i作为函数参数时它才起作用,但是当我使用变量i作为用作函数参数的数组的索引时,它不能工作?

1 个答案:

答案 0 :(得分:4)

您的两个代码都会调用undefined behavior。您可能会得到预期或意外的结果 使用-Wall标志编译代码。编译器应该发出警告:

[Warning] operation on 'i' may be undefined [-Wsequence-point]  

阅读C_FAQ - 3.8。它很好地解释了这个问题。