2.读c语言深度剖析 -- ++、--操作符
2011-11-06 10:42
183 查看
++、--操作符 (经常忘记) 先做一道题: 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 这个例子跟上边的那个例子 均为逗号表达式 [b] [/b]i 在[b]遇到每个逗号后,认为本计算单位已经结束,i 这时候自加[/b] 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++标准里 一个表达式的 子表达式的求值顺序是没有定义的 要求编译器实现时自行定义。所以不同的编译器会给出不同的答案 |
相关文章推荐
- 读c语言深度剖析 -- ++、--操作符
- C语言深度剖析-----函数与指针分析
- c语言深度剖析之学习笔记(二)------------符号
- C语言深度剖析--枚举
- C语言(九) 深度剖析数据在内存中的存储 (下)
- C语言深度剖析学习心得之关键字
- 读c语言深度剖析 -- 第一章 关键字(32个)
- <<C语言深度剖析>>学习笔记之一:C语言中32个关键字
- [学习笔记]C语言深度剖析
- 【C++深度剖析教程17】逻辑操作符的陷阱
- C语言深度剖析之—指针与内存地址(函数指针,普通指针,指针数组,数组的指针,指针的指针)
- C语言深度剖析--运算符
- 读c语言深度剖析 -- switch case
- 读c语言深度剖析 -- return 、exit 、atexit。
- 读c语言深度剖析 -- 运算符的优先级
- 读书笔记之:C语言深度剖析
- 【C语言深度剖析】测试系统存储是大端模式还是小端模式的方法
- C语言深度剖析-----数组与指针分析
- C语言深度剖析-----内存管理的艺术
- C语言深度剖析笔记(指针和数组)