C:运算符 - >和*

G.V*_*.V. 2 c struct pointers 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;
}
Run Code Online (Sandbox Code Playgroud)

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

printf("Result: %s \n", s.numbers.swag->description);
Run Code Online (Sandbox Code Playgroud)

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

printf("Result: %s \n", s.numbers.(*swag).description);
Run Code Online (Sandbox Code Playgroud)

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

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

Vla*_*cow 6

只是用

printf("Result: %s \n", ( *s.numbers.swag).description);
Run Code Online (Sandbox Code Playgroud)

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

postfix-expression . identifier
Run Code Online (Sandbox Code Playgroud)

所以你可以写一些例子

( identifier1 ).identifier2
Run Code Online (Sandbox Code Playgroud)

但你可能不会写

identifier1.( identifier2 )
Run Code Online (Sandbox Code Playgroud)

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

printf("Result: %s \n", ( *( ( ( s ).numbers ).swag ) ).description);
Run Code Online (Sandbox Code Playgroud)