Chinaunix首页 | 论坛 | 博客
  • 博客访问: 239836
  • 博文数量: 49
  • 博客积分: 1595
  • 博客等级: 上尉
  • 技术积分: 497
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-21 15:22
文章分类

全部博文(49)

文章存档

2011年(19)

2010年(30)

我的朋友

分类: C/C++

2011-05-16 15:38:42

    ++、--作为前缀,我们知道是先自加或自减,然后再做别的运算;但是作为后缀时,到
底什么时候自加、自减?这是很多初学者迷糊的地方。
    下面举几个例子,来说明一下:
1)int i=1,j=0; j=(i++,i++,i++);
2)for(i=0;i<10;i++){ /*code*/ }
3) int i=1,k=0;k = (i++)+ (i++)+ (i++);
你可以试着计算他们的结果。
1)例子为逗号表达式,i 在遇到每个逗号后,认为本计算单位已经结束,i 这时候自加。
  运行结果为 i=4,j=3
2)例子i 与10 进行比较之后,认为本计算单位已经结束,i 这时候自加。
3)例子i 遇到分号才认为本计算单位已经结束,i 这时候自加。很多人可能想不到运算结果k=3,
  这是因为i 遇到分号才认为本计算单位已经结束,实际++在遇到分号之前一直没起作用,这个
  语句等价于 k=i+i+i;i++;i++;i++;
 
    另外 还有一个令人头疼的问题 我们把3)的括号去掉,即k = i+++i+++i++;这个跟怎么计算呢?
别急,我们看了下面的“贪心法”,所有问题都迎刃而解了!
    C 语言有这样一个规则:每一个符号应该包含尽可能多的字符。也就是说,编译器将程
序分解成符号的方法是,从左到右一个一个字符地读入,如果该字符可能组成一个符号,
那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组
成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串
已不再可能组成一个有意义的符号。这个处理的策略被称为“贪心法”。需要注意到是,除
了字符串与字符常量,符号的中间不能嵌有空白(空格、制表符、换行符等)。比如:==是
单个符号,而= =是两个等号。
    看到这里,我想大家对可以看出k = i+++i+++i++;其实和 k = (i++)+ (i++)+ (i++);
是一样的效果。
 
    下面 再看一个 例子 int i=5; k=(++i)*(++i); 运行后 k的值是多少呢?答案是 k=49
别惊讶,这和 运算顺序和 i的存储有关,首选计算第一个++i,此时i=6,并将6放进i的存储单元,
然后计算第二个++i,此时i=7,并将7放进i的存储单元,然后再计算k=i*i的值,因为i=7,所以
k=49.
    怎么样,现在对++ --运算符的认识清晰多了吧?
阅读(2250) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~