gpt4 book ai didi

c - 结构指针算子猜想(理论)

转载 作者:行者123 更新时间:2023-12-04 11:07:33 27 4
gpt4 key购买 nike

指向结构的指针如此频繁,以至于有一个特殊的运算符:->。以下表达式是等效的:

(*x).y
x->y


将这个运算符简单地定义为这样的预处理器宏是否公平:

#define (x)-> (*(x).)

为什么或者为什么不?还是从一开始就将其编码为运算符-这有何不同/优势?

只是好奇。

最佳答案

以下表达式等效:


(*x).y
x->y


是的,两者都是访问结构成员 y的两种不同方式。

(*x).y运算符是 . DOT,可与值变量 Element selection by reference一起使用。 *使用原因。表示 x是指向struct的指针。

使用 x->y运算符 ->称为 Element selection through pointer。这与指向结构的指针一起使用。这就是 *这次不使用的原因。

两者的工作原理相同。


将这个运算符简单地定义为这样的预处理器宏是否公平:


#define (x)-> (*(x).)


否首先,它给出一个错误:宏名称必须是标识符。该错误是因为我们不能使用 ->运算符作为宏名。

valid macro name可以是:


宏名称只能由字母数字字符和下划线组成,即“ a-z”,“ A-Z”,“ 0-9”和“ _”,并且第一个字符不应为数字。一些预处理器还允许使用美元符号“ $”,但您不应该使用它。不幸的是,由于我没有C标准,所以我无法引用它。


另外,请注意 ->.是我上面所说的差异运算符。它们的优先级也不同,因此用一个运算符替换另一个运算符是个坏主意。


用于访问结构元素的有效宏:


另外,我只想今天分享我大部分的C头文件。定义的宏如下:

#define S(x)  ((x).y)


用于特定的strcut元素。

请注意,围绕 (x)x括号是要覆盖 *优先于 .的优先级。默认情况下, . DOT的优先级高于 *,因此它可用于指针和简单变量。我认为下面的示例将对您有所帮助。

#define S(x)  ((x).y)
typedef struct {
int y;
}X;
X *x;
X b;
int main(){
S(*x);
S(b);
}


编辑:
更好的选择

我将想法扩展到访问strcut元素,并定义了新的宏:

#define S(x,y)  ((x).y)
typedef struct {
int a;
}X;
X *x;
X b;
int main(){
S(*x,a);
S(b,a);
}


通过宏指定元素的更多信息。

希望至少OP喜欢它:)

关于c - 结构指针算子猜想(理论),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15167542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com