我想知道如何评估下面的语句,它到底是做什么的?
*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/