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

时间:2018-01-12 00:45:43

标签: c

我想知道如何实际评估以下陈述,它到底做了什么?

*ptr1++ = *ptr2++;

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

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

*ptr1 = *ptr2
ptr1++;
ptr2++;

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

没有必要引入时间关系(比如“firstly”和“then”)来理解这个陈述的含义。事实上,用“第一”,“其次”来描述它,这样会产生误导。

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

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

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

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

这告诉我们,赋值运算符将*指向最初位置的数据复制到ptr2指向的最初位置。

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

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

*

答案 1 :(得分:0)

根据C Operator Precedence我会说是和否,结果是等效的,操作的顺序可能不是。

  

来自C Operator Precedence

     

解析表达式时,某行上列出的运算符将会出现   与任何运算符相比,它的参数更严格(就像用圆括号一样)   它列在它下面的一行上。   例如,表达式*p++被解析为*(p++),而不是。{   (*p)++