(*x).y 与 x->y 相同吗?
Is (*x).y the same as x->y?
是否允许在 C 中使用运算符 ->
而不是 .
?它的可用性取决于我们使用的编译器吗? ->
运算符在最新的 C 标准中可用还是来自 C++ 标准?这两者有何不同?
这里有3个运算符,*
、.
和->
。这很重要,因为 .
和 ->
都有优先级 1,但是 *
有 precedence 2。因此 *foo.bar
与 foo->bar
不同并且需要括号,如 (*foo).bar
.
所有都是原始的 C 运算符,并且一直存在。
在一般情况下,是的 - 编译器应该为两者生成相同的代码。但是这些运算符可以被重载,从而具有不同的功能。
在 C 中,c->m
等同于 (*c).m
。括号是必需的,因为 .
的优先级高于 *
。任何受人尊敬的编译器都会生成相同的代码。
在C++中,除非->
或*
是overloaded,否则等价如上。
在 C 中,a->b
和 (*a).b
是 100% 等价的,在 C 中引入 ->
的真正原因是优先级——这样你就不必输入(*a)
.
中的括号
在C++中,operator *
和operator ->
可以独立重写,所以你不能再说a->b
和(*a).b
在所有情况下都是等价的。但是,当 a
是内置指针类型时,它们是 100% 等价的。
运算符 ->
在 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
和returns指针地址处的值。所以 (*f2).x
等价于 f2->x
.
是否允许在 C 中使用运算符 ->
而不是 .
?它的可用性取决于我们使用的编译器吗? ->
运算符在最新的 C 标准中可用还是来自 C++ 标准?这两者有何不同?
这里有3个运算符,*
、.
和->
。这很重要,因为 .
和 ->
都有优先级 1,但是 *
有 precedence 2。因此 *foo.bar
与 foo->bar
不同并且需要括号,如 (*foo).bar
.
所有都是原始的 C 运算符,并且一直存在。
在一般情况下,是的 - 编译器应该为两者生成相同的代码。但是这些运算符可以被重载,从而具有不同的功能。
在 C 中,c->m
等同于 (*c).m
。括号是必需的,因为 .
的优先级高于 *
。任何受人尊敬的编译器都会生成相同的代码。
在C++中,除非->
或*
是overloaded,否则等价如上。
在 C 中,a->b
和 (*a).b
是 100% 等价的,在 C 中引入 ->
的真正原因是优先级——这样你就不必输入(*a)
.
在C++中,operator *
和operator ->
可以独立重写,所以你不能再说a->b
和(*a).b
在所有情况下都是等价的。但是,当 a
是内置指针类型时,它们是 100% 等价的。
运算符 ->
在 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
和returns指针地址处的值。所以 (*f2).x
等价于 f2->x
.