是否允许操作符->
在C中使用而不是.
?它的可用性是否取决于我们使用的编译器? ->
运算符是在最后一个C标准中可用还是来自C ++标准?这两者有何不同?
答案 0 :(得分:12)
在C中,c->m
相当于(*c).m
。括号是必要的,因为.
的优先级高于*
。任何可敬的编译器都会生成相同的代码。
在C ++中,除非->
或*
被重写,否则等价如上所述。
答案 1 :(得分:5)
此处有3位运营商,*
,.
和->
。这很重要,因为.
和->
都优先为1,但*
有precedence 2。因此,*foo.bar
与foo->bar
不同,并且需要括号,例如(*foo).bar
。
所有人都是原创的C运营商,并且一直存在。
答案 2 :(得分:5)
在C中,HamburgerStyle
和a->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)
一般情况下,是 - 编译器应为两者生成相同的代码。但是这些操作符可能会过载,因此具有不同的功能。