如何评估语句*ptr1 ++ =*ptr2 ++?

0 c

我想知道如何实际评估以下声明,它究竟做了什么?

*ptr1++ = *ptr2++;
Run Code Online (Sandbox Code Playgroud)

它首先分配指针指向的值,然后递增吗?

是否与撰写以下内容相同;

*ptr1 = *ptr2
ptr1++;
ptr2++;
Run Code Online (Sandbox Code Playgroud)

等号是否实际上具有比增量符号(++)更高的优先级?

谢谢您的帮助.

AnT*_*AnT 6

没有必要引入时间关系(如"首先"和"然后")来理解这个陈述的含义.事实上,用"第一","其次"来描述它,这样会产生误导.

运算符优先级告诉我们它应该被解释为

*(ptr1++) = *(ptr2++);
Run Code Online (Sandbox Code Playgroud)

即它告诉我们在两种情况下都++适用于指针,而不是指向值.这是所有运营商的优先权告诉我们,不再是.运算符优先级和关联性不定义评估顺序(实际上与它无关).

使用后缀形式的事实++意味着ptr1++子表达式的结果是旧的,原始的,非递增的指针值(对于相同ptr2++).因此,一元运算*符应用于原始指针值.

这就告诉我们,存储在该位置的赋值操作符拷贝的数据最初由指向ptr2的位置原本被指出ptr1.

此语句的副作用(由++运算符生成)递增两个指针.究竟是什么时候发生并不重要.

同样,这并不意味着*应用运算符并且"首先"复制数据并且"之后"增加指针.只要满足所需的语义,编译器就可以按任何顺序自由执行.它可以将其编译为您在问题中建议的代码,或者完全不同的代码.例如

old_ptr1 = ptr1;
ptr1 = ptr1 + 1;
*old_ptr1 = *ptr2;
ptr2 = ptr2 + 1;
Run Code Online (Sandbox Code Playgroud)