繁体   English   中英

左值在C中返回指针

[英]lvalue returned with pointer in C

我试着执行以下代码,

int val=10;
printf("%d",++val++);

正如预期的那样,我得到以下错误消息,“ lvalue required as increment operand ”。 但是,当我做出以下更改时,程序运行正常。

int val=10;
int *ptr=&val;
printf("%d",++*ptr++);

该计划的产出为11 输出值并不令人惊讶。

但是整个构造++*ptr++是一个lvalue而不是rvalue是令人困惑的。

我在之前和之后打印了ptr的内容如下,

printf("%u\n",ptr);
printf("%d",++*ptr++);
printf("\n%d\n",ptr);

22935322293536是在屏幕上打印的地址。 所以很明显ptr已经增加并且涉及指针添加。

除了*ptr检索变量的内容之外,输出是有意义的,该变量的地址存储在ptr ,该变量为10,++*ptr其增加到11 这肯定是一个rvalue 但是后期增量( ++ )已经被ptr绑定了。 为什么这样? 在C中管理此类绑定的规则是什么?

您的观察是正确的,即前缀++应用于指针指向(int)的值,而后缀++应用于指针本身。

这是因为postfix ++运算符的优先级高于* ,因此优先级高。 因此,首先ptr递增并返回其原始值,然后取消引用该指针,并指向它指向的int值,并由表达式返回。 前缀++*之后应用,因为它在代码中的顺序和依赖性,并且它们具有相同的优先级。

PS:打印指针的正确格式化程序是“%p”。

printf("%d",++val++);

Postfix ++的运算符优先级高于前缀++,因此首先评估val++ 操作的结果是右值 - 它不能被修改。 但是前缀++运算符期望操作数是左值 (可修改),因此表达式无效。

printf("%d",++*ptr++);

这里的运算符优先级使得postfix ++仍具有最高优先级。 ptr++将首先得到评估,这意味着应用指针算法将ptr的地址增加一个元素。 在评估ptr之后发生增量。

Prefix ++和unary *具有相同的优先级,但是这组运算符的运算符关联性是从右到左,这意味着*最右边的*首先被评估。 与++运算符不同,一元*不需要左值操作数。 它获得指针类型操作数就足够了,在这种情况下它就是这样。

作为一种特殊情况,一元*运算符在应用于指向对象的指针时,给出的结果是左值。 因此前缀++现在起作用,在前一个表达式中失败。 但是它不会增加指针,而是指向内容:整数加1。

请注意,您不应该将++运算符与其他运算符混合,因为++运算会产生副作用 这样做是不好的做法,可能会调用未定义的行为错误。 有关详细信息,请参见

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM