在 C 中对于后缀和前缀运算符,操作数应该是一个左值,那么在这些运算符的情况下,左值对于指针变量的实际含义是啥?

Posted

技术标签:

【中文标题】在 C 中对于后缀和前缀运算符,操作数应该是一个左值,那么在这些运算符的情况下,左值对于指针变量的实际含义是啥?【英文标题】:In C for postfix and prefix operator, operand should be an lvalue, so what actually lvalue means for a pointer variable in case of these operators?在 C 中对于后缀和前缀运算符,操作数应该是一个左值,那么在这些运算符的情况下,左值对于指针变量的实际含义是什么? 【发布时间】:2020-05-29 11:38:56 【问题描述】:

在 C 中对于后缀和前缀运算符,操作数应该是一个 l 值,所以如果 cp = &ch;并假设 ch 的地址是 1000 并且 cp 的地址是 5000 所以 ++cp 应该是 5001 或 1001 ?

之所以产生这个疑问,是因为 cp 的左值是 cp(5000) 的位置,而 cp 的右值是 5000 处的值,“即 1000”。因此,如果 ++ 运算符对左值起作用,那么它应该增加 5000 而不是 1000(因为它是右值)?

提前致谢。

【问题讨论】:

左值是可以接收值(赋值)的东西(地址)。增加左值通常会增加分配右值的地址。 您可能会得到更多有用的答案,显示一点sn-p代码。我觉得很难确定你在问什么。 【参考方案1】:

如果你有例如这两个声明

char ch = 'A';
char *cp = &ch;

然后这个表达式++cp 增加了存储在变量cp 中的值。该值是变量ch的地址,所以在递增之后,变量cp中存储的值将指向变量ch占用的内存之后的内存。

一元运算符 ++ 可以更改左值表达式的值。例如你可能不会写

char ch = 'A';
`++&ch;`

因为表达式&ch 会产生地址值。

和写是一样的

++3;

而不是

int x = 3;
++x;

【讨论】:

【参考方案2】:

根据 C11 标准 (ISO-IEC-9899-2011)--6.3.2.1 左值、数组和函数指示符:html_versionpdf_version

除了操作数 sizeof 运算符、一元 & 运算符、++ 运算符、-- 运算符或 的左操作数。运算符或赋值运算符, 不具有数组类型的左值被转换为存储在指定的值 对象(不再是左值);这称为左值转换。

其实the result of & operator is rvalue和the result of * operator is lvalue,所以:

int *p1; //variable p1 is a lvalue
int num = 314; //variable num is a lvalue
p1 = # //num is still a lvalue, and keep it that way
int *p2 = p1 + 1; //p1 is still a lvalue, but will become a rvalue through lvalue conversion

【讨论】:

以上是关于在 C 中对于后缀和前缀运算符,操作数应该是一个左值,那么在这些运算符的情况下,左值对于指针变量的实际含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - I. 后缀表达式

前缀,中缀,后缀表达式求值

前缀表达式 与 后缀表达式

前缀中缀后缀表达式(逆波兰表达式)

前缀中缀后缀表达式(逆波兰表达式)

前缀,中缀,后缀表达式