通读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。 所以我真的很困惑。
有谁能阐明这个陈述在语义上是关于什么的,它是如何与所给的例子一步一步地联系起来的?
x=y
返回引用左侧操作数的lvalue.int*j=x=y
,这是错误的,因为操作数的类型无效。但是,
>
int*j=&(x=y)
:
工作,因为x=y
返回L值,所以这可以归结为int*j=&x
(x的值是y)
类似地,此在(&; j=x=y
也可以工作
其他链接:
对于条件表达式:返回类型“?:”(三元条件运算符)