++、--操作符 (经常忘记)
先做一道题:
int i =3;
(++i)+(++i)+(++i);
表达式的值为多少?15吗?16吗?18吗?其实对于这种情况,C语言标准并没有作出规定。
有的编译器计算出来为18,因为i经过3次自加后变为6,然后3个6相加得18;
而有的编译器计算出来为16(比如VisualC++6.0),
先计算前两个i的和,这时候i自加两次,2个i的和为10,然后再加上第三次自加的i得16。
其实这些没有必要辩论,用到哪个编译器写句代码测试就行。但不会计算出15的结果来的。
++、--作为前缀,我们知道是先自加或自减,然后再做别的运算;
但是作为后缀时,到底什么时候自加、自减?
假设i=0,看下边的例子:
int i=0;
int pi = (++i)+(++i)+(++i);
printf("i = %d\n",i); i = 3
printf("pi = %d\n\n",pi); pi = 7 这个跟开篇的例子一样 注:在vc6下调试的 结果 2+2+3
i=0;
int j=(i++,i++,i++);
printf("i = %d\n",i); i = 3
printf("j = %d\n\n",j); j = 2 最后一次i++在分号后加的 所以加不到j上
i=0;
int x= (++i,i++,i+10);
printf("i = %d\n",i); i = 2 注意i+10 not i+=10 += -= 同前缀
printf("x = %d\n",x); x = 12 这个例子跟上边的那个例子 均为逗号表达式
i 在遇到每个逗号后,认为本计算单位已经结束,i 这时候自加
i=0;
int k=(i++)+(i++)+(i++);
printf("i = %d\n",i); i = 3
printf("k = %d\n\n",k); k = 0 i 遇到分号,才认为本计算单位已经结束,i 这时候自加。
for(i=0;i<10;i++)
{
//code
} i 与10进行比较之后,认为本计算单位已经结束,i 这时候自加
也就是说后缀运算是在本计算单位计算结束之后再自加或自减。C语言里的计算单位大体分为以上3类。
再看一道题:
a+++b和下面哪个表达式相当:
A),a++ +b; B),a+ ++b;
调试:
int a=0;
int b=1;
int c=a+++b;
printf("a = %d\n",a);
printf("b = %d\n",b);
printf("c = %d\n",c);
a=1 b=1 c=1
解释 C语言有这样一个规则:
每一个符号应该包含尽可能多的字符。
也就是说,编译器将程序分解成符号的方法是,从左到右一个一个字符地读入,如果该字符可能组成一个符号,
那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;
如果可能,继续读入下一个字符,重复上述判断,
直到读入的字符组成的字符串已不再可能组成一个有意义的符号。
这个处理的策略被称为“贪心法”。
需要注意到是,除了字符串与字符常量,符号的中间不能嵌有空白(空格、制表符、换行符等)。
如:==是单个符号,而= =是两个等号。
按照这个规则可能很轻松的判断a+++b表达式与a++ +b一致。
在c++标准里 一个表达式的 子表达式的求值顺序是没有定义的 要求编译器实现时自行定义。所以不同的编译器会给出不同的答案