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

问题描述 投票:0回答:2
double *p;

显然,gcc 4.6.3 仅在

p
下面的行中将
-O3
加 1。

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

这是一个错误吗?

pointers gcc
2个回答
1
投票

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

如果您希望值增加,您可以这样做

(*p)++
;

另一件事是,您无法保证评估参数的顺序。这取决于编译器。所以左边可以先递增,也可以第二次递增。不管怎样,一个参数将与原始值一起发送,下一个参数将是原始值 + 1(由于后增量的性质); 在函数外部,如果您没有修改函数内部的 *p,则 *p 应该会增加两次。


1
投票

如果增量运算符修改

same variable
中的
same sequence point (statement)
,则会导致未定义的行为。 例如,如果您调用这样的函数:

foo(++i, ++i)

C 标准没有规定增量应该按什么顺序执行,并且您无法预测将传递给函数的内容。 和你的函数的情况是一样的。

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

他们任何一个都可以先评价。

© www.soinside.com 2019 - 2024. All rights reserved.