推荐答案
测试一下
题目
6自增和自减 ................................ ................................ ................................ .............…
参考答案与知识点
参考答案
自增(++)和自减(--)是C/C++中常见的单目运算符,分为前置形式(如 ++i)和后置形式(如 i++)。前置先对变量执行自增/自减,然后返回新值;后置先返回变量的当前值,再执行自增/自减。两者的最终结果都是变量值增减1,但在表达式中的使用时机不同是考察重点。
常见考点:
1. 简单赋值:int i=3; int a = ++i; // i=4, a=4;int b = i++; // i=4, b=3, 之后i=5。
2. 表达式中多次使用同一变量:如 int i=5; int x = i++ + i++; 这是**未定义行为**,因为C标准规定在两个顺序点之间多次修改同一对象是未定义的。不同编译器可能得到不同结果(如10或11等),实际开发应避免此类写法。
3. 顺序点:分号、逻辑与&&、逻辑或||、条件运算符? :的第一个操作数结束、逗号运算符(不是函数参数列表的逗号)等都是顺序点。只有顺序点之前的副作用才保证完成。
4. 函数参数求值顺序未指定:如 printf("%d %d", i++, i++); 参数求值顺序未定,且同样是未定义行为。
易错点:
- 误认为后置自增在表达式结束后立即生效,但实际上后置自增的副作用在函数调用或顺序点之前的某个时刻发生。
- 混淆前缀和后缀在循环中的区别:for (i=0; i<n; i++) 和 for (i=0; i<n; ++i) 在此上下文中等价,但前者可读性更好。
- 在复合表达式中依靠求值顺序:如 *p++ 等价于 *(p++),先取p指向的值,再使p自增,但这是由运算符优先级保证的,并非未定义。
在IC笔试中,常通过给出代码片段要求输出结果或判断是否正确,重点考查对副作用、顺序点和未定义行为的理解。正确做法是:避免在表达式中多次修改同一变量,对于指针遍历使用 *p++ 是惯用法。
涉及知识点
- 前置与后置自增减的区别
- 副作用及其产生时机
- 顺序点与表达式求值
- 未定义行为的常见场景
- 运算符优先级与结合性
- 实际开发中的安全写法