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



我想知道如何实际评估以下语句,它到底有什么作用?

*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 运算符优先级,我会说是和否,结果是等效的,操作的顺序可能不是。

引用自 C 运算符优先级

解析表达式时,列在某行上的运算符将 比任何运算符都更紧密地绑定到其参数(好像用括号) 列在其下方的行中。例如,表达式*p++被解析为*(p++),而不是(*p)++.

最新更新