单引号与双引号
我们知道双引号引起来的都是字符串常量,单引号引起来的都是字符常量。
比如:‘a’和“a”完全不一样,在内存里前者占1个byte,后者占2个byte。
1,‘1‘,“1”。
第一个是整形常数,32位系统下占4个byte;第二个是字符常量,占1个byte;第三个是字符串常量,占2个byte。
三者表示的意义完全不一样,所占的内存大小也不一样
字符在内存里是以ASCAII码 存储的,所以字符常量可以与整形常量或变量进行运算。如:‘A‘+1。
关于字符串常量在指针与数组那章将有更多的讨论。
逻辑运算符
|| 和&& 是我们经常用到的逻辑运算符,与按位运算符|和&是两码事。虽然简单,但毕竟容易犯错。看例子:
int i=0;
int j=0;
if( (++i>0) || (++j>0) )
{
//打印出i和j的值。
}
结果: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”; 两者均正确输出效果是一样的
花括号的作用是什么呢?我们平时写函数,if、while、for、switch语句等都用到了它
但有时又省略掉了它。简单来说花括号的作用就是打包。使之形成一个整体,并与外界绝缘。