Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
3年前关闭。
我可以打印表达式的计算方式吗?
例如,如果我想确定某个值是被评估为右值还是左值,我将假设的代码称为:
当我们在下面发现表达式的“类型”可能取决于它在赋值运算符的右侧还是左侧时,这会产生问题。因此,该测试将更适合
尽管这只是假设,可能只剩下一些基本示例。
原因仅出于实验目的,但如果可能的话,它可能对调试很有用。
错误地使用左值或右值时,会出现编译错误。
想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
3年前关闭。
我可以打印表达式的计算方式吗?
例如,如果我想确定某个值是被评估为右值还是左值,我将假设的代码称为:
int main() {
if(isrvalue(*(int *)4)) return 0;
else return 1;
}
当我们在下面发现表达式的“类型”可能取决于它在赋值运算符的右侧还是左侧时,这会产生问题。因此,该测试将更适合
supports_lvalue(*(int *)4)
尽管这只是假设,可能只剩下一些基本示例。
原因仅出于实验目的,但如果可能的话,它可能对调试很有用。
最佳答案
Lvalue指向可以分配新值的存储位置。包括const
变量在内的所有变量均为左值。左值保留在使用它的表达式之外。另一方面,右值是一个临时值,不会超出使用它的表达式而持续存在。
左值可能出现在赋值运算符的左侧或右侧。但是右值永远不会出现在赋值运算符的左侧。
简而言之:左值是存储区域,右值是值。
例:
int main(){
int i = 10;
int j = 20;
int* ip;
int* jp;
/* ip and jp are pointer variables, hence L-VALUES.
they can appear BOTH sides of = operator.
as shown below.
*/
ip = &i;
jp = &j;
jp = ip;
/* values such as 1, 25, etc are Values, hence R-VALUES
they can appear only RIGHT side of = operartor
as shown below, 1 on left causes error not ip
*/
ip + 1 = &i; // invalid
ip = &i + 1; // valid, however printf("%d", *ip); might print a Garbage value
/* *ip and *jp are also L-VALUES, including *(ip + 1) or *(ip + 2)
they can appear both sides
*/
*ip = 1 + *jp;
return 0;
}
错误地使用左值或右值时,会出现编译错误。