【问题标题】:What is the order of evaluation in below code written in C?下面用 C 编写的代码中的评估顺序是什么?
【发布时间】:2017-07-24 12:11:00
【问题描述】:

a 是指向结构的指针,b 是结构

a++ -> b

上述代码的求值顺序为

((a++) -> b)

(a -> b) ++

【问题讨论】:

  • (a -> b) ++ 的意思与a++ -> b 完全不同。
  • 为什么增量会突然改变影响b?
  • 介于a和b之间,->是最高优先级的运算符权
  • 评估顺序和优先级根本不是一回事。不要将它们混合在一起。

标签: c pointers structure operator-precedence


【解决方案1】:

由于后缀增量指向成员运算符的指针具有完全相同的优先级,所以关联性两个运营商开始发挥作用。两者都是从左到右的。

因此

a++ -> b

被评估为

(a++) -> b

这意味着-> 适用于指针a 的前一个值,a 按照正常规则递增 - 在语句完成执行之前的某个时间完成。

(一个用于公开测验,前缀增量的优先级低于->)。

【讨论】:

  • 这:“一旦表达式完成,a 就会增加 [...]” 不是 100% 准确的。 a 可以在上一个和下一个序列点之间的任何时间递增。
  • 在这种情况下,关联性如何发挥作用?表达是明确的。即使关联性被反转,也没有其他方法可以解析。
  • @pmg:是的,你是对的:我从贴在我办公室墙上的运算符优先级表的脚注中删除了文本。
  • 这是一个很好的 C 运算符优先级表,其中还包含关联性:en.cppreference.com/w/c/language/operator_precedence
  • a++ 的值是多少,因为它是一个指向结构的指针,递增它会使指针跳过整个结构,它会是一个野指针。
【解决方案2】:

根据 C 标准(6.5.2.3 结构和联合成员)

4 后缀表达式后跟 -> 运算符和一个 标识符指定结构或联合对象的成员。这 value 是第一个对象的命名成员的值 表达式点,并且是左值。96) 如果第一个表达式是 指向限定类型​​的指针,结果具有如此限定的版本 指定成员的类型。

在这个表达式中

a++ -> b

a++ 是一个后缀表达式。所以你可以这样写

( a++ ) -> b

该表达式产生指针a在其递增之前的值所指向的对象的数据成员b的值。

这是一个演示程序

#include <stdio.h>

int main( void )
{
    struct A
    {
        int b;
    } pair[] = { { 1 }, { 2 } };

    struct A *a = pair;

    printf("%d\n", a++->b);
    printf("%d\n", a++->b);

    return 0;
}

程序输出是

1
2

【讨论】:

    猜你喜欢
    • 2016-11-20
    • 1970-01-01
    • 2023-03-03
    • 2010-09-18
    • 2015-11-02
    • 1970-01-01
    • 2016-11-24
    • 2021-02-14
    相关资源
    最近更新 更多