【问题标题】:Precedence of the arrow operator and post increment?箭头运算符和后增量的优先级?
【发布时间】:2021-01-31 15:47:12
【问题描述】:

C 新手。所以我看到了这行代码

system->word[system->index++] = system->next_char;

是否等同于:

system->word[system->index] = system->next_char;
index++;

后期增量的优先级是什么?是否只在该行的所有操作执行完成后将 index 的值加 1?

【问题讨论】:

  • 也许您应该阅读有关序列点和未定义行为的信息。
  • 有关运算符优先级的表格,请参见此链接:en.cppreference.com/w/c/language/operator_precedence
  • @user202729 OP 的第一条语句中没有隐含的未定义行为。
  • @AdrianMole:也就是说,假设systemstruct 而不是union
  • @adr 我知道,但这是 op 在阅读或编写类似代码时应该知道的。

标签: c operator-precedence


【解决方案1】:

更新system->index 被定义为一个副作用,它在语句中的其他操作没有排序(没有指定在之前或之后)。更新可能发生在其他操作之前、期间或之后。

只要它没有在语句的其他地方使用,它没有排序的事实就无关紧要,因为如果它没有在其他地方使用,那么语句所做的任何事情都不会受到更新发生时的影响。 (注意,即使在内存中对system->index的更新是在使用值之前完成的,编译器也会响应以确保使用更新前的值。)

如果被更新的对象在语句的其他地方以无顺序的方式使用(也就是说,没有规则指定先使用,更新或其他使用),那么程序的行为将不会由 C 定义标准。

这不是优先级的结果。优先级决定了如何解释表达式的结构,而不是它们的操作顺序。

【讨论】:

  • 所以 system->word[system->index++] = system->next_char;和 system->word[system->++index] = system->next_char;真的做同样的事情吗?
  • @walzhe:没有。system->index++ 使用 system->index 的值,因为它将在更新之前使用。 ++system->index 使用 system->index 的值,因为它将在更新后使用。 system->++index 语法无效。
  • 哦,好吧,我明白了。感谢您的澄清!
【解决方案2】:

不是。

system->word[system->index++] = system->next_char;

相当于:

system->word[system->index] = system->next_char;
system->index++;

因为indexstruct 上的一个字段,由system 指向。如果您还有一个名为 index 的标量变量,则您没有错误,但应该增加错误的变量。

作为一般规则,所有一元运算符首先在变量的右侧计算,然后在左侧(右侧运算符的优先级高于左侧运算符)并计算从最接近操作数到最远。所以最接近操作数的运算符首先计算,然后是右边的下一个......所以直到右边没有更多 right 运算符,然后是左边最近的运算符,依此类推直到左边不再有 left 运算符

如果我们有 -x++ 会发生什么? ++ 首先被评估为x 的值,并且计划发生变量的后增量,然后评估左侧的值,结果给出x 的值之前 递增,符号改变,变量x 的值递增(仅递增,符号不变)。

另一个例子:让我们计算++x->field:首先->field(整个事情,-> 箭头和字段名称)被认为是右一元运算符,给定一个指针获取名为 @ 的字段中的值987654335@ 由x 指向的结构。该值递增(并再次存储在x->field 中),返回的值是最终递增的值。

最后一个例子:让我们计算*p++p 的值计划后递增,但保留其先前的值。然后p的旧值被用来访问它所指向的值,给原来指向的值。最后p 递增并指向访问值旁边的值。

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 2021-03-08
    • 2020-08-19
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2021-10-20
    • 2015-04-17
    • 2020-03-22
    相关资源
    最近更新 更多