例题1.
int main()
{
int i = 1;
printf("%d %d\n",++i ,++i); // 从右往左算, i+1 = 2,再加1 等于 3 ,此时 i(本身) 的值 等于3
printf("%d %d\n",++i ,i++); // 从右至左, i++后 i(本身) 4 中间变量3 ,++i 后 变成5
printf("%d %d\n",i++ ,i++); // 右至左, i++后 (本身) 6 中间变量 5 ,在i++后同理 i本身变成了7
printf("%d %d\n",i++ ,++i); // printf输出++i本身, ++i一开始是8,到i++后中间变量8 本身变成了9
// 所以最后输出 8 9
return 0;
}
上述题的输出结果是
3 3
5 3
6 5
8 9
知识点:
1 printf 函数中的计算是从右往左进行的
2 printf 输出的是 变量 i 本身的值
3 ++i 运算之后 printf 输出的是 i 本身的值 ,i++ 运算之后会有两个值,一个是 i 未加一的值(中间变量),另一个是 i 加一后的值, printf 输出 i++ 输出的是中间变量。
总结
++i 与 i++ 是面试题中常常考察的知识点,看似简单,但如果不细心思考仍然会出错。
++i 与i++的区别有两个
1. ++i 返回的 是 加1后的 值 i++ 先 返回原来的 值 再加1
2. i++ 不能做为左值,而 ++i 可以
什么叫 i++ 不能为左值呢?何为左值?
左值,c/c++ 中可以存放在 赋值符号左边 的 变量。左值表示 存储在计算机内存的对象,而不是常量计算的结果
右值,当一个符号或者常量放在操作符右侧的时候,计算机就读取他们的右值
也就是说,左值相当于地址,右值相当于数值
//前缀形式:
int& int::operator++() //返回值为引用类型,也就是说函数返回值可以做为左值使用
{
*this += 1; //自增1
return *this; //返回引用
}
//后缀形式:
const int int::operator++(int) //返回值非左值类型
{
//函数带参数,说明另外开辟了内存空间
int oldValue = *this; //取值
++(*this); //自增
return oldValue; //返回被取的值
}