问题的历史:
自增操作符++和自减操作符--出现在C的最早版本中,受低级机器语言功能的启发。前缀形式(++i, --i)和后缀形式(i++, i--)给程序员提供不同的语义,计算成本极低。
问题:
主要的困难在于前缀形式和后缀形式的表现不同:前缀形式首先增加/减少值,然后返回结果,而后缀形式首先返回原始值,然后改变变量。在嵌套表达式中,这常常会引起混淆、意外行为和错误使用值。
解决方案:
重要的是要明确每种形式返回的内容。当需要立即获取新值时,使用前缀版本。当需要保留旧值(例如,传递给函数或计数器逻辑)时,使用后缀版本。好的做法是避免与多个自增混合使用的复杂表达式,并避免与副作用混合使用。
代码示例:
int i = 5; printf("%d\n", ++i); // 输出6 printf("%d\n", i++); // 输出6,但现在i变成7
主要特点:
可以使用i = i++吗?会发生什么?
使用构造i = i++会导致未定义行为(undefined behavior):编译器没有义务保证预期结果,程序可能表现得不可预测。
代码示例:
int i = 1; i = i++; printf("%d\n", i); // 结果依赖于编译器:可能输出1或2
在一行中多次使用一个变量的自增有什么危险?
在一个表达式中对同一个变量进行多次修改(例如,f(i++, i++))的行为在C标准中是未定义的。最终结果依赖于编译器的具体实现。
i++总是比++i快吗?
不是。在现代编译器中,通常没有差别,因为编译器会以相同的方式优化这两种形式,除非使用了返回的值。
在循环中,开发者写道:
for (int i = 0; i < 10;) arr[i] = i++ * 2;
优点:
缺点:
default
for (int i = 0; i < 10; i++) arr[i] = i * 2;
优点:
缺点: