我正在攻读编程语言的考试,我偶然发现了这个问题(用C语言编写):
*tp++ = *sp++
;
我理解*tp = *sp
;可能会这样做,但在这里,指针何时递增?之前,在获取值之后?按什么顺序?我很感激你的回答
答案 0 :(得分:7)
由于++
运算符位于变量之后,因此在计算表达式后,值将递增。因此,这会将sp
当前指向的值分配给tp
当前指向的位置,然后递增两个指针。
如果表达式是
*(++tp) = *(++sp)
然后指针会在评估之前递增。
这些结构通常出现在循环中。
答案 1 :(得分:3)
*tp++ = *sp++;
相当于
*tp = *sp;
tp++;
sp++;
所以它将sp
指向的值复制到tp
指向的位置,然后递增两个指针。
答案 2 :(得分:3)
你应该小心相信'之后'这个词。确实,在这个示例中,行为就好像指针在赋值后递增一样,但是C编译器没有义务按顺序执行操作,只要结果相同。
具体来说,有以下步骤:
对订单的唯一限制是显而易见的,即值必须在使用之前可用。您无法知道,也不应该猜测,编译器会选择什么顺序。另一方面,分号(语句终止符)是一个'序列点',告诉编译器它不允许对它进行重新排序 - 除非它能证明它不会改变结果(但可能更快,例如)。
如果你试图在同一个语句中多次使用相同的指针变量,那么这一切都是最重要的,但即使在你的例子中,如果你的指针碰巧指向自己,它也会有所不同。
答案 3 :(得分:1)
++
是后增量运算符,因为它们会立即出现在指针之后(而不是之前);两个指针在赋值后(递归引用的地址)递增。
相当于:
*tp = *sp;
tp++;
sp++;
答案 4 :(得分:1)
在
*tp++ = *sp++;
有四件事情可以解决:
tp
sp
只要结果正确,任何订单都有效(仅取决于QOI)
*tp = *sp; tp++; sp++;
savedtp_register = tp; tp++; *savedtp_register = *sp; sp++;
savedsp_register = *sp; sp++; *tp = savedsp_register; tp++;
答案 5 :(得分:-1)
在指针地址彼此相等之后,它们会递增。如果您不想这样,则应使用++*tp
和++*sp
。