[英]Is (*x).y the same as x->y?
運算符->
允許在 C 中使用而不是.
? 它的可用性是否取決於我們使用的編譯器? ->
運算符是在上一個 C 標准中可用還是來自 C++ 標准? 這兩者有何不同?
在 C 中, c->m
等價於(*c).m
。 括號是必需的,因為.
具有比*
更高的優先級。 任何受人尊敬的編譯器都會生成相同的代碼。
在 C++ 中,除非->
或*
被重載,否則等價如上。
這里有 3 個運算符, *
, .
和->
。 這很重要,因為.
和->
都具有優先級 1,但*
具有優先級 2 。 因此*foo.bar
與foo->bar
,並且需要括號,例如(*foo).bar
。
所有這些都是原始的 C 運算符,並且一直存在。
在 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
,它返回指針地址處的值。 所以(*f2).x
等價於(*f2).x
f2->x
。
在一般情況下,是的 - 編譯器應該為兩者生成相同的代碼。 但是這些運算符可以重載,因此具有不同的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.