我想知道如何实际评估以下陈述,它到底做了什么?
*ptr1++ = *ptr2++;
首先分配指针所指向的值然后递增吗?
是否与撰写以下内容相同;
*ptr1 = *ptr2
ptr1++;
ptr2++;
等号是否实际上具有比增量符号(++)更高的优先级?
感谢您的帮助。
答案 0 :(得分:6)
没有必要引入时间关系(比如“firstly”和“then”)来理解这个陈述的含义。事实上,用“第一”,“其次”来描述它,这样会产生误导。
运算符优先级告诉我们它应该被解释为
*(ptr1++) = *(ptr2++);
即。它告诉我们在两种情况下++
适用于指针,而不是指向值。这是所有运营商的优先权告诉我们,不再。运算符优先级和关联性不定义评估顺序(实际上与它无关)。
使用++
的后缀形式这一事实意味着ptr1++
子表达式的结果是旧的,原始的,非递增的指针值(对于{{ 1}})。因此,一元ptr2++
运算符应用于原始指针值。
这告诉我们,赋值运算符将*
指向最初位置的数据复制到ptr2
指向的最初位置。
此语句的副作用(由ptr1
运算符生成)会增加两个指针。究竟是什么时候发生并不重要。
同样,这并不意味着应用++
运算符并且“首先”复制数据并且“之后”增加指针。只要满足所需的语义,编译器就可以按任何顺序自由执行。它可以将其编译为您在问题中建议的代码,或者完全不同的代码。 E.g。
*
答案 1 :(得分:0)
根据C Operator Precedence我会说是和否,结果是等效的,操作的顺序可能不是。
解析表达式时,某行上列出的运算符将会出现 与任何运算符相比,它的参数更严格(就像用圆括号一样) 它列在它下面的一行上。 例如,表达式
*p++
被解析为*(p++)
,而不是。{(*p)++
。强>