关于character pointer中Post increment operator的代码行为等价性问询
关于C语言中后置自增运算符与指针操作的代码等价性问题
变量定义
首先明确我们讨论的变量定义:
char *s;
待分析的原代码
我们需要分析其行为的代码如下:
while ( *s ) if ( *s++ == ' ' ) break;
修正后的对比选项
最初给出的选项存在语法错误(多写了不必要的*运算符),修正后的正确选项如下:
选项1
while ( *s ) { if ( *s == ' ' ) { s++; break; } s++; }
选项2
while ( *s ) { s++; if ( *s == ' ' ) break; }
核心疑问
本质是要明确:指针自增操作s++是在if的字符比较判断之前还是之后执行?
等价性结论
原代码中*s++ == ' '的执行顺序是固定的:
- 先解引用当前指针
s,获取指向的字符; - 执行
s++,将指针向后移动一位; - 把第一步获取的字符和
' '比较,若相等则执行break跳出循环。
对照修正后的选项:
- 选项1与原代码完全等价:它先检查当前指针指向的字符是否为空格,若是则自增指针后跳出;若不是则自增指针后进入下一轮循环,和原代码的执行逻辑完全一致。
- 选项2逻辑错误:它先自增指针,再检查新位置的字符是否为空格,和原代码的判断时机完全相反。
另外你理解的这段代码也和原代码等价:
char *s; char c; while ( *s ) { c = *s++; if ( c == ' ' ) break; }
这段代码只是把*s++的结果存入临时变量c再做比较,执行逻辑和原代码没有区别。
内容的提问来源于stack exchange,提问作者Bill_Stewart
相关产品推荐
相关产品推荐

