You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K&R中*p->str++与*s++运算行为及运算符优先级疑问

C语言运算符优先级与*s++行为解析

结论先行

你的认知是错误的,存在两处核心偏差:

  • *s++的行为是先取s当前指向的内容,再对s本身执行自增,和K&R描述完全一致
  • *s++和(*s)++行为完全不同,二者操作的对象、执行顺序都有本质区别

核心规则:运算符优先级与结合性

C语言中相关运算符的优先级从高到低排序如下:

  1. 后缀自增运算符++、成员访问运算符->:优先级为最高的1级,结合性为从左到右
  2. 间接寻址运算符*:优先级为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 08:54:04