C编译器中的常见表达式替换错误了吗?

时间:2013-07-24 00:56:25

标签: pointers gcc compiler-construction

double *p;

显然,gcc 4.6.3仅在p下的以下行中将-O3增加1。

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

这是一个错误吗?

2 个答案:

答案 0 :(得分:1)

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

如果你希望增加值,你可以(*p)++;

另一件事是,您无法保证评估参数的顺序。这取决于编译器。所以左侧可以先增加,然后可以增加第二个。无论一个参数是否与原始值一起发送,下一个参数将是原始值+ 1(由于后期增量的性质); 在函数外部,如果你没有在其中修改* p,* p应该增加两次。

答案 1 :(得分:1)

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

foo(++i, ++i)

C标准没有说明应该以哪种顺序执行增量,并且您无法预测将传递给函数的内容。 与你的功能相同。

  

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

他们中的任何一个都可以先评估。

相关问题