是(* x).y与x-> y相同吗?

时间:2016-01-29 07:47:52

标签: c struct dereference

是否允许操作符->在C中使用而不是.?它的可用性是否取决于我们使用的编译器? ->运算符是在最后一个C标准中可用还是来自C ++标准?这两者有何不同?

5 个答案:

答案 0 :(得分:12)

在C中,c->m相当于(*c).m。括号是必要的,因为.的优先级高于*。任何可敬的编译器都会生成相同的代码。

在C ++中,除非->*重写,否则等价如上所述。

答案 1 :(得分:5)

此处有3位运营商,*.->。这很重要,因为.->都优先为1,但*precedence 2。因此,*foo.barfoo->bar不同,并且需要括号,例如(*foo).bar

所有人都是原创的C运营商,并且一直存在。

答案 2 :(得分:5)

在C中,HamburgerStylea->b是100%等效的,将(*a).b引入C的原因是优先级 - 这样您就不必输入->中的括号。

在C ++中,(*a)operator *可以独立覆盖,因此您无法再说operator ->a->b在所有情况下都是等效的。但是,当(*a).b是内置指针类型时,它们是100%等效的。

答案 3 :(得分:1)

运营商->是C中的标准。.->都允许访问struct字段。您应该在.变量上使用struct,在->变量上使用struct pointer

struct foo {
    int x;
    int y;
}

struct foo f1;
f1.x = 1;
f1.y = 3;
struct foo *f2 = &f1;
printf("%d\n", f1.x);     // 1
printf("%d\n", f2->x);    // 1

*运算符被称为dereference operator并返回指针地址处的值。因此(*f2).x相当于f2->x

答案 4 :(得分:0)

一般情况下,是 - 编译器应为两者生成相同的代码。但是这些操作符可能会过载,因此具有不同的功能。