【问题标题】:Order of evaluation in C (for expression with * and ++) [duplicate]C中的评估顺序(用于带有*和++的表达式)[重复]
【发布时间】:2017-10-07 15:51:08
【问题描述】:

如果我们有

int i = 5; /*line 1*/
int *p = &i; /*line 2*/
*p++; /*line 3*/ 

第 3 行的评估顺序是什么? (我知道在这个 p 之后可能会指向一些奇怪的东西 - 但我对正确的内存寻址不感兴趣,但对评估顺序不感兴趣,因为 * 和 ++ 似乎具有相同的优先级)

【问题讨论】:

  • 不,它们的优先级不同。后缀形式 ++ 的优先级高于 *,与前缀形式不同。
  • 记住++ 递增指针的简单方法是注意通常的单行strcpy 实现:while(*dst++ = *src++); 如果++ 递增实际字符而不是指针,则会失败。跨度>
  • 运算符优先级是discoverable thing
  • @OliverCharlesworth 我使用了“C 编程语言”(K&R 第 48 页)中的优先表,其中 * 和 ++ 位于同一行。

标签: c operator-precedence postfix-operator


【解决方案1】:

不,postfix increment has higher precedence

在您的情况下,增量的副作用将在值评估 note 之后发生(使用取消引用运算符)。但是,值评估的结果会被丢弃(您没有努力存储结果)。

所以,最后,结果将是 等价 p++;


注意:

引用C11,第 §6.5.2.4 章,(强调我的

后缀++ 运算符的结果是操作数的值。作为一个副作用, 操作数对象的值递增(即相应类型的值 1 为 添加到它)。参见关于加法运算符和复合赋值的讨论 有关约束、类型和转换以及操作对 指针。 结果的值计算在副作用之前排序 更新操作数的存储值。 [...]

【讨论】:

  • 那么,即使应该首先评估 ++(通过具有更高的优先级),它也会推迟到 *p 被评估?
  • @Alex 是的,“增量”是一个副作用,后缀 ++ 的值是操作数本身的值,正如我的回答中已经强调的那样。
  • @Alex - 确实 - 评估顺序和优先级本质上是不相关的;见stackoverflow.com/a/5475260/129570
【解决方案2】:

*p++ 被视为*(p++),因为后缀++ 的优先级高于*

【讨论】:

  • 你确定吗?
  • @SouravGhosh 是的先生。
  • @SouravGhosh - 从语义上讲,这是一个正确的评估。编译器可能会在增量之前对加载进行排序,但是对于标准 *p++ 定义的 C 抽象在语义上等同于 *(p++),正如 rsp 所说。
  • @StoryTeller 和 rsp - 正确,感谢您的确认。 :)
  • 为什么所有的字符串函数都是这样完成的:while (*str) something = *str++。如果字符串为abcd,则根据您的回答和所有cmets,设置为something的值需要为bcd*p++ 的评估方式是先读/写当前的p 地址,然后执行增量。
【解决方案3】:

您必须在 *p 周围加上括号才能使其工作:

int i = 5; /*line 1*/
int *p = &i; /*line 2*/
(*p)++; /*line 3*/ 
printf("Hello, World! %d\n", *p); 

见:http://en.cppreference.com/w/c/language/operator_precedence

【讨论】:

  • 为了什么工作? OP 没有具体说明他希望发生什么,只是询问如何评估这三行。
  • 你是对的。事实上,OP 应该只编译并运行一些关于运算符优先级的变体,然后看看它们是如何匹配预期的。哦,好吧 - SO 不是一个容易赢得积分的游戏! :-)
猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 2018-06-16
相关资源
最近更新 更多