2013-07-24 29 views
-1
double *p; 

显然,gcc 4.6.3只会在-O3的下一行中将p加1。C编译器中错误的通用表达式替换?

myfunc (*(p++), *(p++)); 

这是一个错误?

+0

您可能想要搜索术语“序列点”。这是一个关于增量运算符的常见问题,我认为如果您搜索该网站,您可以找到一些非常好的答案。 – templatetypedef

+2

每行代码的一项操作就是要走的路 - 您可以使代码更易于阅读,而且不会遇到这类问题。 –

+0

@EdHeal +1对于'每行代码的一个操作是要走的路线' –

回答

1

*(p++)不增加指针指向的值。

如果你想增加值你会做(*p)++;

另一件事是,您不能保证评估参数的顺序。这取决于编译器。所以左侧可以先递增,然后递增。无论哪一个参数将以原始值发送,接下来将是原始值+ 1(由于后增量的性质); 在函数之外,如果您没有在其中修改* p,那么* p应该已经增加了两次。

1

如果增量运算符修改same sequence point (statement)中的same variable,则会导致未定义的行为。 例如,如果你调用一个函数是这样的:

foo(++i, ++i) 

C标准不说,其中责令增量应该进行,你不能预测什么会被传递给函数。 它与您的功能相同的情况。

myfunc (*(p++), *(p++))

其中一方可以先评估。