++、--作为前缀,我们知道是先自加或自减,然后再做别的运算;但是作为后缀时,到
底什么时候自加、自减?这是很多初学者迷糊的地方。
下面举几个例子,来说明一下:
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.
怎么样,现在对++ --运算符的认识清晰多了吧?
阅读(2303) | 评论(0) | 转发(0) |