Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1839300
  • 博文数量: 333
  • 博客积分: 10791
  • 博客等级: 上将
  • 技术积分: 4314
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 07:39
文章分类

全部博文(333)

文章存档

2015年(1)

2011年(116)

2010年(187)

2009年(25)

2008年(3)

2007年(1)

分类: C/C++

2010-01-17 16:18:34

1、左值和右值
左值,即能够出现在赋值符号左边的东西;它标识了一个可以存储结果值的地址。
右值,即能够出现在赋值符号右边的东西;它指定了一个值。
*p可以当作左值的原因:指针p的值是内存中某个特定的地址,*操作符使得机器指向那个位置。
2、++与--

#include<stdio.h>
int main()
{
  int a = 1;
  int b = 1;
  int c;

  c = (++a) + (a++) + (b *= a++) +(a *= 2) + (a *= a++);
  
  printf("c = %d\n",c);
  printf("b = %d\n",b);
  printf("a = %d\n",a);
  return 0;
}//endmain

   1)、执行时,先分配临时内存,然后由于5个“()”,其计算顺序是从左向右,计算++a的值,返回增一后的a的地址,a的值为2。
   2)、计算a++的值,返回临时内存的地址,a的值仍为2
   3)、计算b *= a++中的a++,返回临时内存的地址,a的值仍为2。计算b *= a++中的“*=”,将a的值写入临时内存,计算得b的值为2,返回b的地址
   4)、计算a *= 2的值,返回a的地址,a的值为4
   5)、计算a *= a++中的a++,返回临时内存的地址,a的值仍为4。计算a *= a++中的“*=”,将a的值写入临时内存,返回a的地址,a的值为16
   6)、计算剩下的“+”,为了进行计算,不同编译器结果不同。用gcc编译器编译后,c结果为:26即将个个表达式的值写入临时内存,得值2 + 2 + 2 + 4 + 16为26,写入c中。在其他编译环境没实验,读者可自行实验,看看结果
   7)、计算三个a++欠下的加1,a最后变为19。
阅读(573) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~