提问者:小点点

接受左值操作数的运算符的结果是一个表示该左值操作数的左值?


通读Bjarne的CPP书,我遇到过这样一个语句:“在逻辑上可行的情况下,接受一个lvalue操作数的运算符的结果是一个lvalue,表示该lvalue操作数”,我真的无法理解它。 以下是本声明中的示例:

void f(int x, int y)
{
    int j = x = y; // the value of x=y is the value of x after the assignment
    int∗ p = &++x; // p points to x
    int∗ q = &(x++); // error : x++ is not an lvalue (it is not the value stored in x)
    int∗ p2 = &(x>y?x:y); // address of the int with the larger value
    int& r = (x<y)?x:1; // error : 1 is not an lvalue
}

代码本身对我来说是有意义的,但从我个人对这些运算符如何工作的理解来看,它是有意义的。 但是我不能真正地在这里应用这个语句,例如第一行。 好的,=是一个可以接受lvalue和rvalue操作数的运算符(根据我的理解,在本例中lvalue是隐式转换为rvalue的),那么x=y的结果是一个表示y的lvalue吗? 如果我正确地理解了这一点,那么我可以编写int*j=x=y,但是这将是一个编译时错误,因为x=y的结果显然是一个rvalue。 所以我真的很困惑。

有谁能阐明这个陈述在语义上是关于什么的,它是如何与所给的例子一步一步地联系起来的?


共1个答案

匿名用户

  • x=y返回引用左侧操作数的lvalue.
  • int*j=x=y,这是错误的,因为操作数的类型无效。

但是,

>

  • int*j=&(x=y):

    工作,因为x=y返回L值,所以这可以归结为int*j=&x(x的值是y)

    类似地,此在(&; j=x=y也可以工作

    其他链接:

    对于条件表达式:返回类型“?:”(三元条件运算符)