簡體   English   中英

(*x).y 和 x->y 一樣嗎?

[英]Is (*x).y the same as x->y?

運算符->允許在 C 中使用而不是. ? 它的可用性是否取決於我們使用的編譯器? ->運算符是在上一個 C 標准中可用還是來自 C++ 標准? 這兩者有何不同?

在 C 中, c->m等價於(*c).m 括號是必需的,因為. 具有比*更高的優先級。 任何受人尊敬的編譯器都會生成相同的代碼。

在 C++ 中,除非->*重載,否則等價如上。

這里有 3 個運算符, * , . -> 這很重要,因為. ->都具有優先級 1,但*具有優先級 2 因此*foo.barfoo->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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM