hare_Lee的专栏

路漫漫其修远兮 吾将上下而求索

3.读c语言深度剖析 -- 单引号与双引号、逻辑运算符、位运算符、花括号

 

单引号与双引号

我们知道双引号引起来的都是字符串常量,单引号引起来的都是字符常量。

比如:‘a’和“a”完全不一样,在内存里前者占1byte,后者占2byte

1,‘1‘,“1”。

第一个是整形常数,32位系统下占4byte第二个是字符常量,占1byte第三个是字符串常量,占2byte

三者表示的意义完全不一样,所占的内存大小也不一样

字符在内存里是以ASCAII码 存储的,所以字符常量可以与整形常量或变量进行运算。如:‘A+1

关于字符串常量在指针与数组那章将有更多的讨论。

 逻辑运算符

||  和&& 是我们经常用到的逻辑运算符,与按位运算符|&是两码事。虽然简单,但毕竟容易犯错。看例子:

int i=0;

int j=0;

if( (++i>0) || (++j>0) )

{

   //打印出ij的值。

}

结果:i=1;j=0。不要惊讶。

逻辑运算符||两边的条件只要有一个为真,其结果就真;只要有一个结果为假,其结果就为假。

if((++i>0)||(++j>0))语句中,先计算(++i>0),发现其结果为真,后面的(++j>0)便不再计算。

同样&&运算符也要注意这种情况。这是很容易出错的地方,一定要注意。

位运算符

C语言中位运算包括下面几种:

&按位与    |按位或    ^按位异或

~取反     <<左移    >>右移

4种操作很简单,一般不会出错。但要注意按位运算符|&与逻辑运算符||&&完全是两码事,别混淆了。

其中按位异或操作可以实现不用第三个临时变量交换两个变量的值:a^=b;   b^=a;  a^=b;

但并不推荐这么做,因为这样的代码读起来很费劲。

左移和右移

左移运算符<<”是双目运算符。

其功能把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0

右移运算符>>”是双目运算符。

其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。

但注意:对于有符号数,在右移时,符号位将随同移动.

当为正数时,最高位补0;

而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定TurboC和很多系统规定为补1

0x01<<2+3的值为多少?

结果为7吗?测试一下。结果为为 32

因为“+”号的优先级比移位运算符的优先级高

好,在32位系统下,再把这个例子改写一下:

0x01<<2+30;或0x01<<2-3

这样行吗?不行。一个整型数长度为32位,左移32位发生了什么事情?

溢出!左移-1位呢?反过来移?

切记,左移和右移的位数是有讲究的。左移和右移的位数不能大于数据的长度,不能小于0

花括号

char a[10]= {“abcde”};

char a[10]=“abcde”;    两者均正确输出效果是一样的

花括号的作用是什么呢?我们平时写函数,ifwhileforswitch语句等都用到了它

但有时又省略掉了它。简单来说花括号的作用就是打包。使之形成一个整体,并与外界绝缘。

阅读更多
个人分类: C的分析
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭