我学为我的编程语言考试,我在无意中发现这个(用C语言编写):理解C:递增指针
*tp++ = *sp++
;
我明白了什么*tp = *sp
;可能会做,但在这里,指针何时增加?之前,值提取后?按什么顺序?我很感谢你的回答
我学为我的编程语言考试,我在无意中发现这个(用C语言编写):理解C:递增指针
*tp++ = *sp++
;
我明白了什么*tp = *sp
;可能会做,但在这里,指针何时增加?之前,值提取后?按什么顺序?我很感谢你的回答
由于++
操作符位于变量之后,因此值将在计算表达式后递增。因此,这会将当前由sp
指向的值分配给当前由tp
指向的位置,然后增加两个指针。
如果表达式代替
*(++tp) = *(++sp)
然后,指针将评估之前递增。
这些结构通常发生在循环内部。
+1。很好的解释。 – 2011-05-28 12:19:14
它们在指针地址相等后递增。如果你不想这样做,你应该使用++*tp
和++*sp
。
,该值不会做您认为的操作! – 2011-05-28 12:16:16
是的,++ * tp递增了tp指向的值,而不是tp本身。此外,原始表达式与指针的地址*是否相等无关。 – 2011-05-28 12:17:24
++
是后增加操作符,因为它们立即出现在指针之后(而不是紧接在之前);两个指针在赋值之后(取消引用的地址)递增。
它等同于:
*tp = *sp;
tp++;
sp++;
*tp++ = *sp++;
相当于
*tp = *sp;
tp++;
sp++;
所以它复制的价值指向sp
的位置指向tp
再增加两个指针。
+1。从我....... – 2011-05-28 12:25:49
在
*tp++ = *sp++;
有四件事情hapenning:
tp
sp
只要结果是正确的,任何顺序是有效的(它只是取决于一种或多种QoI)
*tp = *sp; tp++; sp++;
savedtp_register = tp; tp++; *savedtp_register = *sp; sp++;
savedsp_register = *sp; sp++; *tp = savedsp_register; tp++;
你应该小心相信'后'这个词。确实,在这个的例子中,的行为就好像指针在赋值之后递增,但C编译器没有义务按照该顺序实际执行任何操作,只要结果相同即可。
具体地,存在以下步骤:
订单上的唯一的限制是明显的,即正在使用前值必须是可用的。你不知道,也不应该猜测,编译器会选择什么样的顺序。另一方面,分号(语句终结符)是一个“序列点”,它告诉编译器不允许对它重新排序效果 - 除非它能证明它不会改变结果(但可能会更快,例如)。
如果您尝试在同一个语句中多次使用相同的指针变量,那么这些都是最相关的,但即使在您的示例中,如果您的指针碰巧指向自己,它也可能会有所不同。
这是一个后增量操作符,因此它会提取该值,然后递增指针地址 – 2011-05-28 12:15:30