【问题标题】:Wrong common expression substitution in C compiler?C编译器中错误的通用表达式替换?
【发布时间】:2013-07-24 00:56:25
【问题描述】:
double *p;

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

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

这是一个错误吗?

【问题讨论】:

  • 您可能想要搜索术语“序列点”。这是关于增量运算符的常见问题,我认为如果您搜索该站点,您可以找到一些非常好的答案。
  • 每行代码一个操作是可行的方法 - 您可以使代码更易于阅读,并且不会遇到这些问题。
  • @EdHeal +1 for '每行代码一个操作就是要走的路'
  • 专业提示:这几乎不是编译器错误。

标签: pointers gcc compiler-construction


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    foo(++i, ++i)
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多