在以下示例中:
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).y
与x->y
printf("Result: %s \n", s.numbers.(*swag).description);
我在编译期间收到以下错误:
C:\ main.c | 26 |错误:'之前的预期标识符('令牌|)
答案 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).y
与x->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
并取消引用访问说明。
[]
运算符与.
具有相同的优先级和关联性。所以你可以从左到右阅读那个表达式。