C 什么是l值和r值表达式?
pre++、post++和*,其优先顺序是什么?如何在VS08编译器中解析这些表达式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
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找出你认为应该打印的内容,然后试试看