结构指针运算符猜想(理论)

时间:2013-03-01 21:58:47

标签: c pointers syntax struct operators

结构的指针经常被使用,因此有一个特殊的操作符: - >。以下表达式是等效的:

(*x).y
 x->y

将此运算符简单地视为预定义宏定义如此公平是否合理:

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

为什么或为什么不呢?或者它从一开始就被编码为运营商 - 这将如何不同/有利?

好奇。

3 个答案:

答案 0 :(得分:4)

  

以下表达式是等效的:?

(*x).y
 x->y

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

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

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

两者都相同。

  

将此运算符简单地视为预定义宏定义是否公平:

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

首先它提供错误: 宏名称必须是标识符。此错误是因为我们不能将->运算符作为宏名称。

valid macro name可以是:

  

宏名称应仅包含字母数字字符和下划线,即“a-z”,“A-Z”,“0-9”和“_”,并且第一个字符不应为数字。一些预处理器也允许美元符号字符'$',但你不应该使用它;不幸的是我不能引用C标准,因为我没有它的副本。

另外,注意->.是差异运算符,如上所述。它们的优先级也不同,所以用一个操作符替换其他操作符是个坏主意。

  

访问struct元素的有效宏:

另外我想今天分享只有我才知道大多数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喜欢它:)

答案 1 :(得分:4)

  

将此运算符简单地视为预定义宏定义如此公平是否合理:

没有

  

为什么或为什么不呢?

->运算符具有一些不能用宏强制执行的特定语义(这是一个简单的文本替换)。也就是说,左侧操作数必须是指向struct或union类型的指针,右侧操作数必须是struct或union类型的成员,并且表达式的结果必须是一个左值。您无法使用宏强制执行这些规则。

答案 2 :(得分:1)

  

将此运算符简单地视为预定义宏定义如此公平是否合理:

不,它不会。

  

为什么或为什么不呢?

因为它不是宏。它是一种在语言中定义的独特运算符,似乎为另一种功能提供了语法糖。