学习C++两个年头了,在学习的过程中经常碰到一些看似很简单,但却经常被人忽略的语法问题。在此我整理一下自己在学习过程中范的一些小错误,错误虽小,但却必须重视。
第一个问题:
#include <vector> #include <iostream> using namespace std; void main() { int i = 2, j; j = i++ + ++i; cout << j <<endl; //等于6 i = 2; i = i++ + ++i;//换((i++) + (++i));此种形式,依然等于7 cout << i <<endl; //等于7,为什么等于7呢? }
自认为大虾的朋友们,可以试试能看出问题吗?
根据cyz108D这位哥们的评论,我总结了原因如下:
问题是由于i++引起的,i = i++ + ++i会先执行i = 右边的表达式,最后再i++操作,所以结果就出现了一个6,一个7。
总结:操作符优先级问题。
第二个问题:
UINT uN = 3;
BOOL bRt = (-1 < uN);
bRt结果为FALSE。原因估计很多朋友,都能说的出来。
无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据,比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。
总结:切记不要用无符号整型和负数比较。因为程序会将-1转换成无符号整型后再和无符号整型作比较,-1转成无符号整型后会变成很大的数 。
第三个问题:
与或优先级问题,看看各位大虾有多少和我犯同样错误的?
x = 1, y = 0, z = -1;
q = ++x || ++y && ++z;
q会等于0?还是1?
你认为呢?
看分析:
优先级 操作符
1 () [] -> .
::
! ~ ++ --
2 - (unary) * (dereference)
& (address of) sizeof
3 ->* .*
4 * (multiply) / %
5 + -
6 << >>
7 < <= > >=
8 == !=
9 & (bitwise AND)
10 ^
11 |
12 &&
13 ||
14 ? :
15 = += -= etc.
16 ,
注意:由于||和&&都是从左向右执行,而&&优先级大于||,所以实际执行效果是q=(++x)||(++y && ++z);
所以q的结果是1。
我原先一直停留在&&和||的优先级相同,共同存在时都是自左向右执行,结果就成了0.
说了惭愧啊。。