注册 登录
编程论坛 C语言论坛

c语言小白关于指针的问题

Wheat123 发布于 2019-10-20 13:13, 5170 次点击
*p++为什么是先取出变量在指向下一个地址
而不是先指向下一个地址,再取出下一个地址的变量
++的优先级不是高于*吗?
10 回复
#2
zbjzbj2019-10-20 13:24
个人理解:p++,是p运算以后再+1,这里的运算就是*p
#3
Wheat1232019-10-20 13:26
回复 2楼 zbjzbj
好像有点道理
#4
c小白23332019-10-20 20:27
C语言中是关于读取
如果连接在一起
是从左向右读取 连在一起读取
直到读取的字符不能作用则进行下个
如果可以作用则一起作用
如*q 可以作用而 *q+不能直接进行作用 则将*q 和+分开
接下来+和+可以连接在一起
则就进行了先取出变量在指向下一个地址
如a+++++b
则是 a ++ ++ +b
a先进行++再进行++在进行+b
#5
纯蓝之刃2019-10-20 22:13
编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个处理策略有时被称为“贪心法”。
另一种表述是,输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符之后可能组成一个符号的最长字符串。
#6
bcbbcclbbc2019-10-20 23:37
“*”和“++”这两个单目运算符,优先性是一样的,而且是从左到右的先后顺序。
先p++再*p,p++因为是“++”再后面,类似于副作用(整个式子结束后才生效);然后“*p”为p当前指向的地址的值。
连起来就是先取出指针p指向的地址的值,然后将p指向下一个地址。
如果用的话最好加个括号,做个提示。
#7
宁缺T2019-10-23 07:44
取值运算符的优先级比自加的要低。
只有本站会员才能查看附件,请 登录
#8
rjsp2019-10-23 09:09
以下是引用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自增发生于*()之前还是之后则无所谓。
#9
forever742019-10-23 18:32
嗯,麻烦版主一下,
后缀自增的优先级大于前缀自增
这个出处在哪,我得学习一下补补课。
#10
rjsp2019-10-24 08:30
回复 9楼 forever74
https://zh.
#11
forever742019-10-26 20:18
学习了,谢谢版主。
其实是不同的解释方式,后缀自增如果算在单目运算符里面那就是从右向左的结合性,后缀还是先结合,客观效果还是一样的。
1