[英]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);
2293532和2293536是在屏幕上打印的地址。 所以很明显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.