C:运算符 - >和*

时间:2018-01-08 11:57:32

标签: c pointers struct postfix-operator

在以下示例中:

typedef struct {
    const char *description;
    float value;
} swag;

typedef struct {
    swag *swag;
    const char *sequence;
} combination;

typedef struct {
    combination numbers;
    const char *make;
} safe;

int main()
{
    swag gold = {"GOLD!", 1000000.0};
    combination numbers = {&gold, "6502"};
    safe s = {numbers, "RAMACON250"};

    //Correct handling
    printf("Result: %s \n", s.numbers.swag->description);

    //Faulty handling
    // printf("Result: %s \n", s.numbers.(*swag).description);

    return 0;
}

以下行是正确的,以便接收"GOLD!"

printf("Result: %s \n", s.numbers.swag->description);

但是为什么以下内容不正确,因为(*x).yx->y

相同
printf("Result: %s \n", s.numbers.(*swag).description);

我在编译期间收到以下错误:

  

C:\ main.c | 26 |错误:'之前的预期标识符('令牌|)

4 个答案:

答案 0 :(得分:6)

只需使用

printf("Result: %s \n", ( *s.numbers.swag).description);

根据C语法,后缀表达式.的定义方式如下

postfix-expression . identifier

所以你可以写一些例如

( identifier1 ).identifier2

但你可能不会写

identifier1.( identifier2 )

回到你的程序,你甚至可以写

printf("Result: %s \n", ( *( ( ( s ).numbers ).swag ) ).description);

答案 1 :(得分:3)

  

为什么以下不正确,因为(* x).y与x-> y相同

printf("Result: %s \n", s.numbers.(*swag).description);

(*x).yx->y

相同是正确的

但是你在代码中做了什么:

s.numbers.(*swag).description

这样看:

when comparing s.numbers.swag->description to x->y

x is s.numbers.swag
y is description

so by simple substitution

x->y equivalent to (*x).y becomes (*s.numbers.swag).description

答案 2 :(得分:2)

只需用swag [0]替换* swag。

printf("Result: %s \n", s.numbers.swag[0].description);

记住*赃物和赃物[0],都是一样的。

答案 3 :(得分:1)

.->具有相同的运算符优先级,其关联性从左到右。这就是为什么

s.numbers.swag->description

工作正常。而且,直观地说,您可以从左到右遵循解决的问题。 您可以访问s,然后访问numbers,然后swag,您可以取消引用description

你犯的错误就是得出结论,因为a->b等同于(*a).b ,表达式

s.numbers.(*swag).description

应该等同于上面的那个。事实并非如此。

这是因为(一元)*运算符的优先级低于.->,其关联性是从右到左,并且括号不能解决(您想要访问swag指针,而不是swag成员。

有效的做法是:访问s然后numbers然后取消引用swag(数字)并尝试访问description。但是numbers只有指向swag而不是swag成员的指针。

已经在另一个答案中提到了等价表达式,我在此重复完整性:

(*s.numbers.swag).description

访问s,然后访问numbers,然后访问swag,并取消访问说明。 请注意,.的优先级高于*,并且在.之前解析括号,因为从左到右的关联性。

s.numbers.swag[0].description

访问s然后numbers然后swag并取消引用访问说明。 []运算符与.具有相同的优先级和关联性。所以你可以从左到右阅读那个表达式。