C 什么是l值和r值表达式?

C 什么是l值和r值表达式?,c,lvalue,rvalue,C,Lvalue,Rvalue,pre++、post++和*,其优先顺序是什么?如何在VS08编译器中解析这些表达式 void main(){ int arr[] ={34,11,43}; int *ptr = arr; printf("%d",++*ptr++); printf("%d",++ptr++); } 解释l值表达式。我想了解为什么+++*ptr++是一个有效的表达式,而+++ptr++给出了错误 error: '++' needs l-valu

pre++、post++和*,其优先顺序是什么?如何在VS08编译器中解析这些表达式

 void main(){
        int arr[] ={34,11,43};
        int *ptr = arr;
        printf("%d",++*ptr++);
        printf("%d",++ptr++);
 }
解释l值表达式。我想了解为什么+++*ptr++是一个有效的表达式,而+++ptr++给出了错误

error: '++' needs l-value
说明:增量前
p
和增量后
p
(未指定顺序)。即使它被允许,它也会调用未定义的行为

无论如何,递增运算符post和pre返回一个。右值是表达式的值。它没有可写入的位置,可以将其视为中间值

*p++
此表达式最初产生左值,
*p
。该位置可以写入,因此它会按预增量递增,然后
p
本身也会递增。增量会产生一个右值,但您不会试图修改它

说明:增量前
p
和增量后
p
(未指定顺序)。即使它被允许,它也会调用未定义的行为

无论如何,递增运算符post和pre返回一个。右值是表达式的值。它没有可写入的位置,可以将其视为中间值

*p++

此表达式最初产生左值,
*p
。该位置可以写入,因此它会按预增量递增,然后
p
本身也会递增。增量会产生一个右值,但您不会试图修改它

在C编程中,预增量和预减量运算符返回一个右值,它本质上告诉您它是一个结果,而不是一个赋值的地方。在C++编程中,预增量和预减量运算符返回一个LLVIEW,在这里可以执行进一步的赋值。 像这样的声明,

int i=10;
++i=5;

在C++中是同步有效的。但在C语言中,这是一个语法错误

即使在C++中,PASTROST和POST减量操作符也返回一个R值。因此,下面的语句将给您在C和C++中的语法错误。

int i=10;
i++=5;

在C编程中,预增量和预减量运算符返回一个右值,它本质上告诉您它是一个结果,而不是一个赋值的地方。在C++编程中,预增量和预减量运算符返回一个LLVIEW,在这里可以执行进一步的赋值。 像这样的声明,

int i=10;
++i=5;

在C++中是同步有效的。但在C语言中,这是一个语法错误

即使在C++中,PASTROST和POST减量操作符也返回一个R值。因此,下面的语句将给您在C和C++中的语法错误。

int i=10;
i++=5;
优先级分别为
++(*(ptr++)
++(ptr++)

ptr++
是一个右值,因为语言定义是这样说的。(右值表示可以使用该值,但不能尝试引用存储该值的内存位置)

++
运算符更新存储在内存位置中的值,因此它只能应用于左值。因此,
++(ptr++)
是一种违反约束的行为

但是,
*
可以应用于右值,结果是左值(即指定内存位置的表达式)。因此
++
可以应用于
*ptr++

优先级分别为
++(*(ptr++)
++(ptr++)

ptr++
是一个右值,因为语言定义是这样说的。(右值表示可以使用该值,但不能尝试引用存储该值的内存位置)

++
运算符更新存储在内存位置中的值,因此它只能应用于左值。因此,
++(ptr++)
是一种违反约束的行为


但是,
*
可以应用于右值,结果是左值(即指定内存位置的表达式)。所以
++
可以应用于
*ptr++

我想了解为什么+++*p++有效,++p++无效“++p++说:增量前p和增量后p(未指定顺序)”--这是错误的。见马特·麦克纳布的答案。“此表达式最初生成右值,*p”-*p是左值。“然后p本身递增。递增返回一个右值”--这是荒谬的;增量是一种副作用,它不会“返回”任何内容,在序列点之前可能不会发生。此外:“此表达式最初产生一个右值,*p”--不,它产生
*p
的内容,该内容传递给
printf
。表达式和它们产生的值是不同的。我想了解为什么+++*p++是有效的,++p++是无效的“++p++说:增量前p和增量后p(按未指定的顺序)”--这是错误的。见马特·麦克纳布的答案。“此表达式最初生成右值,*p”-*p是左值。“然后p本身递增。递增返回一个右值”--这是荒谬的;增量是一种副作用,它不会“返回”任何内容,在序列点之前可能不会发生。此外:“此表达式最初产生一个右值,*p”--不,它产生
*p
的内容,该内容传递给
printf
。表达式和它们产生的值是不同的。ptr+1也是一个右值“因为语言定义是这样说的”,但它还有更多的含义。。。非取消引用的表达式作为值的目标没有意义。此语句打印什么?-->printf(“%d”,++*ptr++);35还是12?@piyukr找出你认为应该打印的内容,然后尝试一下,seeptr+1也是一个右值,“因为语言的定义是这样的”,但还有更多。。。非取消引用的表达式作为值的目标没有意义。此语句打印什么?-->printf(“%d”,++*ptr++);35还是12?@piyukr找出你认为应该打印的内容,然后试试看