获取条件表达式的地址

时间:2019-05-10 15:31:07

标签: c pointers conditional-operator

我有以下代码:

index <- c(0.8,0.2,-0.2,0,-1,-1)
df <- data.frame(index)
df$indexclass <- NA


df$indexclass  <- if (df$index >= 0.8) {
  df$indexclass  <- "P"
} else if (df$index <= (-0.8)) {
  df$indexclass  <- "A"
} else { df$indexclass <- "S"}

编译时,在最后一行出现错误:

struct S {
    int x;
};

#define X(a, s) ((struct S*)(a ? &s : 0))

int main(void)
{
    int a;
    struct S s;
    struct S *t;
    int *x;

    a = 3;
    s.x = 4;

    x = &(X(a, s)->x);
    t = &(X(a, s));
}

为什么“&(X(a,s)-> x)”是有效代码,但“&(X(a,s))”不是有效代码?两者都涉及返回条件表达式的地址。

1 个答案:

答案 0 :(得分:5)

&(X(a, s))中,&被应用于((struct S*)(a, &s : 0))。该表达式的类型为struct S*,它是一个值(指向struct S的指针的值)。 &可能不适用于不是左值的值。 1

&(X(a, s)->x)中,&被应用于((struct S*)(a, &s : 0))->x。该表达式采用指向struct S的指针,并使用它来引用成员x,该成员为int。它是一个左值,因为它指定了作为成员int的{​​{1}}对象(C 2018 6.5.2.3 4明确表示x的结果是一个左值)。由于它是左值,因此可以将->应用于它。

脚注

1 根据C 2018 6.5.3.2 1,必须将地址运算符&应用于函数指定符,&或一元[ ]的结果,或指定非位字段且未用*声明的对象的左值。