常被人忽略的一些语法问题

来源:互联网 发布:unity3d poolmanager 编辑:程序博客网 时间:2024/06/06 00:07

学习C++两个年头了,在学习的过程中经常碰到一些看似很简单,但却经常被人忽略的语法问题。在此我整理一下自己在学习过程中范的一些小错误,错误虽小,但却必须重视。

第一个问题:

#include <vector>#include <iostream>using namespace std;void main(){int i = 2, j;j = i++ + ++i;cout << j <<endl;  //等于6i = 2;i = i++ + ++i;//换((i++) + (++i));此种形式,依然等于7cout << 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.

说了惭愧啊。。


原创粉丝点击