在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作为用作函数参数的数组的索引时,它不能工作?
答案 0 :(得分:4)
您的两个代码都会调用undefined behavior。您可能会得到预期或意外的结果
使用-Wall
标志编译代码。编译器应该发出警告:
[Warning] operation on 'i' may be undefined [-Wsequence-point]
阅读C_FAQ - 3.8。它很好地解释了这个问题。