C语言对指针使用后置自增不生效但加等于赋值正常,是什么原因?
问题原因分析
核心是C语言的运算符优先级规则导致的逻辑不符合预期:
- 后置自增运算符
++的优先级高于指针解引用运算符*,所以你写的*pCharCount++不会按照你预想的「先取指针指向的数值,再给这个数值加1」执行,实际等价于*(pCharCount++),执行顺序为:- 先记录
pCharCount当前存储的内存地址 - 将
pCharCount指针本身的值加1,也就是让指针指向了下一个int类型长度的内存地址,这已经不是你原本传入的计数变量的地址了 - 最后对第一步记录的原始地址做解引用,但这个操作没有任何赋值逻辑,完全不会修改原本的计数变量
所以这个写法不仅没完成计数加1的需求,还把指针的指向改乱了,后续所有操作都会访问错误的内存地址,自然无法得到正确结果。
- 先记录
正确写法说明
你用的*pCharCount += 1是符合需求的,因为*优先级高于+=,会先解引用拿到指针指向的计数变量,再给变量值加1。
如果你想用自增语法实现同样的效果,只需要加括号调整优先级即可:
(*pCharCount)++; // 先解引用拿到计数变量,再对变量做自增 (*pWordCount)++;
补充说明
另外你当前的单词计数逻辑存在缺陷:连续出现多个空白符、文件首尾存在空白符的场景下,会出现计数错误,你可以后续调整判断逻辑,只在「当前字符是非空白符,且前一个字符是空白符/文件起始」的时候才给单词计数加1,统计结果会更准确。
内容的提问来源于stack exchange,提问作者JDillon522
相关产品推荐
相关产品推荐

