K&R中*p->str++与*s++运算行为及运算符优先级疑问
C语言运算符优先级与
*s++行为解析 结论先行
你的认知是错误的,存在两处核心偏差:
*s++的行为是先取s当前指向的内容,再对s本身执行自增,和K&R描述完全一致*s++和(*s)++行为完全不同,二者操作的对象、执行顺序都有本质区别
核心规则:运算符优先级与结合性
C语言中相关运算符的优先级从高到低排序如下:
- 后缀自增运算符
++、成员访问运算符->:优先级为最高的1级,结合性为从左到右 - 间接寻址运算符
*:优先级为2级,结合性为从右到左
按照优先级规则,*s++会先绑定优先级更高的后缀++,等效于*(s++),而非你以为的(*s)++。
各表达式的实际执行逻辑
1. *(s++)(即*s++的等效写法)
后缀++的固有特性是返回变量自增前的原始值,所以执行逻辑分为两步:
- 第一步:返回
s当前存储的地址值,用这个地址做间接寻址,取出对应存储单元的内容 - 第二步:将
s本身存储的地址值自增1(偏移量对应s指向的数据类型长度)
举个实际示例:如果
s是指向字符数组第0位的char*类型指针,*s++会先取出数组第0位的字符,再让s指向数组第1位,整个过程中数组存储的内容不会被修改。
2. (*s)++
括号改变了优先级绑定顺序,先执行*s取到s指向的内容,再对这个内容值执行后缀自增:
- 第一步:取出
s指向的存储单元中的值,作为返回值 - 第二步:将该存储单元中的值加1,
s本身存储的地址不会发生任何变化
3. *p->str++的一致性验证
->运算符和后缀++同属最高优先级组,结合性从左到右,所以*p->str++等效于*( (p->str)++ ),逻辑和*s++完全一致:先取p->str当前指向的内容,再对p->str这个指针本身执行自增,和K&R的描述完全匹配。
内容的提问来源于stack exchange,提问作者o o
相关产品推荐
相关产品推荐

