我理解为了它的工作需要
void increment(int *value)
{
(*value)++;
}
这是因为它需要括号,因为优先级如何工作(如果我错了,请纠正我)。但是,当我执行以下操作时,怎么没有发生编译错误?由于没有括号,但是这个值没有改变,因为没有括号,但这究竟是什么变化?
void increment(int *value)
{
*value++;
}
答案 0 :(得分:7)
value
是指向整数的指针。指针算法的规则说如果你执行value++
之类的操作,那么它将指向value + sizeof(int)
(以字节为单位)。
这里发生的事情是,您将解除引用value
以获得一些您刚刚丢弃的右值,然后递增value
(而不是它指向的东西,而不是,指针本身)。
答案 1 :(得分:2)
*value++;
它取消引用value
指向的位置处的值,并由于后递增而递增指针value
。实际上,它与value++
相同,因为您丢弃了表达式返回的值。
But how come when I do the following, no compile error happens?
因为它是一个有效的语句,您只是丢弃表达式返回的值。同样,您可以使用以下语句:
"Random string";
42;
它们是有效的,编译得很好(但没用)。
我们丢弃了许多标准库函数的返回值。例如。 memset()
将void *
返回到已设置的内存,但我们很少使用它。这不是那么直观,但它完全有效。
答案 2 :(得分:0)
虽然不完全是答案:从K& R C来看,这就是memcopy的实现方式。如果您了解正在发生的优先事项,您将能够自己回答您的问题。
void *memcpy(char *ptr1, char *ptr2, size_t n) {
void *ret = ptr1;
while (n >0) {
*ptr1++ = *ptr2++;
n--;
}
return ret;
}
答案 3 :(得分:0)
根据运营商的precedence,
++
位于*
因此,它被执行为
value++
和*
。实际上,*(value++)
value++
会返回value + (size of datatype pointed at)
的地址,即value + (size of int)
。
除非你的value
指向一个数组,否则你可能会获取一个垃圾值并将其解除引用。