Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过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;
}


错误地使用左值或右值时,会出现编译错误。

10-07 13:35
查看更多