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

学习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.

说了惭愧啊。。


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值