赞
踩
1.++i
++i和等同于
1 i = i + 1;
2.i++
i++可以等同于
- 1 int temp = i; // 一个与i类型相同的临时变量
- 2 i = i + 1;
3.相同点和不同点
相同点:i最后都会被加1;
不同点:在i++中多了一个与i类型相同的临时变量,i++是右值,++i是左值。
例子1:
- 1 int a = 1, b = 2;
- 2 int *pt;
- 3 pt = &a;
- 4
- 5 pt++ = &b; // 错误
- 6 //上式等价于
- 7 //int *temp = pt;
- 8 //temp = &b; 给一个临时指针变量赋值无意义
- 9 //pt = pt + 1;
- 10
- 11 *pt++ = b; // 正确
- 12 //int *temp = pt;
- 13 // *temp = b; => a = b; 起到临时指针变量的作用
- 14 // pt = pt + 1;
例子2:
- 1 int fun()
- 2 {
- 3 int i = 0;
- 4 return i++;
- 5 }
- 6 // 等价于
- 7 int fun()
- 8 {
- 9 int i = 0;
- 10 int temp = i;
- 11 i = i+ 1;
- 12 return temp;
- 13 }
- 14 // 根据C11,i++和return之间存在序列点,i++在序列点之前,序列
- 15 //点之前的表达式及其副作用会被先计算,计算完之后return才会被执行
例子3:
- 1 #include <stdio.h>
- 2 int main(void)
- 3 {
- 4 int a = 5;
- 5 int *p = &a;
- 6 int b = (*p)++; //等价于b = a++; 即b = a; a = a + 1;
- 7 int c = ++(*p); //等价于c = ++a; 即a = a + 1; c = a;
- 8 printf("b = %d, c = %d\n", b, c);
- 9 printf("(*p)++ = %d, ++(*p) = %d\n", (*p)++, ++(*p));
- 10 return 0;
- 11 }
- 12 例子输出结果:
- 13 b = 5, c = 7 ;
- 14 (*p)++ = 8, ++(*p) = 8
对于行9的情况应该避免,作为printf函数的参数(*p)++和 ++(*p)的计算没有先后顺序,依赖于编译器,因此在不同的编译器会产生不同的结果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。