我想知道如何评估下面的语句,它到底是做什么的?

*ptr1++ = *ptr2++;

它是否先指定指针指向的值,然后递增?
它是否与下面写的一样;
*ptr1 = *ptr2
ptr1++;
ptr2++;

等号实际上比递增号(++)具有更高的优先级吗?
谢谢你的帮助。

最佳答案

没有必要引入时间关系(比如“先”和“后”)来理解这句话的含义。事实上,用“第一”、“第二”等词语来描述它是有误导性的。
运算符优先级告诉我们应该将其解释为

*(ptr1++) = *(ptr2++);

也就是说,它告诉我们在这两种情况下++都适用于指针,而不是指向值。这就是运算符优先级告诉我们的,不再是了。运算符优先级和关联性不定义求值顺序(实际上与此无关)。
使用后缀形式的++意味着ptr1++子表达式的结果是旧的、原始的、不递增的指针值(与ptr2++相同)。因此,一元*运算符应用于原始指针值。
这告诉我们,赋值运算符将存储在最初由ptr2指向的位置的数据复制到最初由ptr1指向的位置。
此语句的副作用(由++运算符生成)使两个指针都增加。具体发生在什么时候并不重要。
同样,这并不意味着应用*运算符,数据被“先”复制,指针被“后”递增。只要满足所需的语义,编译器就可以按任意顺序执行。它可以将它编译成您在问题中建议的代码,或者完全不同的代码。例如。
old_ptr1 = ptr1;
ptr1 = ptr1 + 1;
*old_ptr1 = *ptr2;
ptr2 = ptr2 + 1;

关于c - 如何评估语句* ptr1++ = * ptr2++?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48218011/

10-11 22:58