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