以下是引用Wheat123在2019-10-20 13:13:16的发言:
*p++为什么是先取出变量在指向下一个地址
而不是先指向下一个地址,再取出下一个地址的变量
++的优先级不是高于*吗?
++的优先级不是高于*吗?
------ 要说准确,
后缀自增优先级 大于 解引用优先级,而
前缀自增优先级 等于 解引用优先级的。
*p++为什么是先取出变量在指向下一个地址
------ 这就是你老师失职的地方(我个人怀疑你是《谭C》的受害者),记住“
优先级/结合性 与 求值顺序 无关”!
以 *p++ 为例:
根据运算符的优先级和结合性,编译器将它看作 *(p++)。
*(p++) 是个复合操作,子表达式是 p++,需要
先被评估,但其
副作用未必需要先发生。
补充一下,假如你看的是《谭C》,估计你连 p++ 是什么都不知道。p++ 是
返回其自增之前的值,副作用是p的值自增1。
因此 a = *(p++) 可以被编译器解析为:
TYPE temp = p; // 这是子表达式 p++ 的评估值
p = p + 1; // 这是子表达式 p++ 的副作用
a = *temp;
其中 副作用 只要发生在下一个序列点之前就行,因此 a = *(p++) 也可以被编译器解析为:
a = *temp;
p = p + 1;
但无论如何解析,p++ 的评估都发生在 *(p++) 之前,而p自增发生于*()之前还是之后则无所谓。