double *p;
显然,gcc 4.6.3 仅在
p
下面的行中将 -O3
加 1。
myfunc (*(p++), *(p++));
这是一个错误吗?
*(p++)
不会增加指针指向的值。
如果您希望值增加,您可以这样做
(*p)++
;
另一件事是,您无法保证评估参数的顺序。这取决于编译器。所以左边可以先递增,也可以第二次递增。不管怎样,一个参数将与原始值一起发送,下一个参数将是原始值 + 1(由于后增量的性质); 在函数外部,如果您没有修改函数内部的 *p,则 *p 应该会增加两次。
如果增量运算符修改
same variable
中的 same sequence point (statement)
,则会导致未定义的行为。
例如,如果您调用这样的函数:
foo(++i, ++i)
C 标准没有规定增量应该按什么顺序执行,并且您无法预测将传递给函数的内容。 和你的函数的情况是一样的。
myfunc (*(p++), *(p++))
他们任何一个都可以先评价。