算数操作符
C提供了所有常用的算术操作符:+ - * / %
除了%操作符,其余几个操作符都是既适用于浮点类型又适用于整数类型。%为取模操作符,它接受两个整数操作符,把左操作数除以右操作数,但它返回的值是余数而不是商。举一个例子:
28%6的值是4,相当于28除以6取余数
移位操作符
左移位:<< 右移位:>>
移位操作符只是简单的把一个数的二进制值的位想左或向右移动。在左移中,值最左边的几位被丢弃,右边多出来的几个空位则由0补齐。比如左移3位:
右移位操作存在一个左移位不曾面临的问题:从左边移入新位时,可以选择两种方式补齐。一种是逻辑移位,左边用0补齐,另一种是算数移位,左边用原先该值的符号位补齐,符号为为1则补1,符号位为0则补0,这样能够保持原数的正负形式不变。比如值10010110右移两位,逻辑移位的结果是00100101,但算数移位的结果是11100101。算数左移的结果和逻辑左移是一样的。(标准说明无符号值执行的所有移位操作都是逻辑移位,但对于有符号值,到底是逻辑移位还是算数移位取决于编辑器)
位操作符
位操作符有:& | ^
他们分别执行AND,OR和XOR操作,它们要求的操作数为整数类型,它们对操作数对应的位进行指定操作,每次对左右操作数的各一位进行操作。&(与运算) | (或运算)^ (异或运算)具体操作如图,假设a为00101110,b为01011011。两数进行位运算:
单目操作符
C具有一些单目操作符,也就是只接受一个操作数的操作符。它们是:
! ++ - & sizeof
~ – + * (类型)
让我们逐个来介绍这些操作符。
!操作符对它的操作数执行逻辑反操作;真变假,假变真,它返回一个整型结果1或0。
~操作符对整型类型的操作数进行求补操作,操作数中所用原先为1的位变为0,所有原先为0的位变为1。
-和+相当于给操作数取正负。
&操作符产生它的操作数的地址,例如,下面的语句声明了一个整型变量和一个指向整型变量的指针。接着,&操作符取变量a的地址,并把它赋值给指针变量b。
int a,b;
...
b = &a;
- 操作符是间接访问操作符,它与指针一起使用,用于访问指针所指向的值。在前面例子中的赋值操作完成之后,表达式b的值是变量a的地址,但表达式*b的值则是变量a的值。
sizeof 操作符判断它的操作数的类型长度,以字节为单位表示。操作数可以是表达式(常常是单个变量),也可以是两边加上括号的类型名。这里有三个例子:
1.sizeof(int);
2.sizeof(x);
3.sizeof(a = b+1);
1.第一个表达式返回整型变量的字节数,int型变量占4个字节所以返回4(其结果也取决于你所使用的环境)。
2.第二个表达式返回变量x所占据的字节数。注意,从定义上说,字符变量的长度为1个字节。当sizeof的操作数是个数组名时,它返回该数组的长度,以字节为单位。
3.第三个表达式,判断表达式的长度并不需要对表达式进行求值,所以sizeof(a=b+1)并没有向a赋任何值。
(类型) 操作符被称为强制类型转换(cast),它用于显示地把表达式的值转换为另外的类型。例如为了得到整型变量a对应的浮点数值,你可以这样写
(float)a;
最后我们讨论增值操作符++和–。a++相当于a=a+1。–同理。增值操作符分为前置和后置也是有区别的,例如:
int a,b,c,d;
...
a = b = 1; //a和b得到了值1
c = ++a; //a的先值增加到2,再赋值给c
d = b++; //b的值先赋给d,自身再增加到2
注意不能写出如下代码:
++a = 10;
++a的结果是a值的拷贝,并不是变量本身,你无法向一个值进行赋值。
关系操作符
这类操作符用于测试操作数之间的各种关系,C提供了所有常见的关系操作符,这些操作符是:
< <= > >= != ==
前四个操作符的功能一看便知。!=操作符用于测试“不相等”,而==操作符用于测试“相等”。
这些关系操作符一般用于if()和while()中,用于判断关系是否成立,如果符合关系操作符的表表示则返回1,反之则返回0。
逻辑操作符
逻辑操作符有&&和 ||,它们用于对表达式求值,测试他们的值是真还是假,让我们先看一下&&操作符。
expression1 && expression2
如果expression1 和 expression2的值都是真的,那么整个表达式的值也是真的。如果两个表达式中的任何一个表达式的值为假,那么整个表达式的值便为假。&&操作符有一个有趣之处在于它可以控制子表达式的求值顺序。例如,下面这个程序:
int a = 0, b = 0,c,d;
c = (a = 5) && (b = 2);
d = (a == 0) && (b = 1);
由于第一次&&两边进行的是赋值操作,所以判断所得的值是否为0,如果为0则为假。显然第一个&&两边得到的值都为1,所以不仅将a和b分别赋值5和2,而且c也得到了一个1的真值。第二个&&,&&操作符在进行运算的时候,遵循从左到右原则,所以先判断a是否等于0,判断结果为假所以左边子表达式得到一个0,此时整个表达式已经为假,所以给d赋值0的假值,b=1,这时右边的子表达式不在进行。所以程序最终a=5,b=2。
|| 语句当expression1 和 expression2的值都是假的,那么整个表达式的值也是假的。如果两个表达式中的任何一个表达式的值为真,那么整个表达式的值便为真。同理,遵循从左到右,如果判断左边的子表达式为真,那么整个表达式都为真,就不用进行右边的子表达式。
条件操作符
条件操作符接受三个操作数。它也会控制子表达式的求值顺序。下面是它的用法:
expression1 ? expression2 : expression3;
当expression1成立则输出expression2表达式的值,否则输出expression3表达式的值。
条件操作符的优先级非常低,所以它的各个操作数即使不加括号,一般也不会有问题。但是,为了清楚起见,人们还是倾向于在它的各个表达式两端加上括号。
运算符的优先级
C++/C 语言的运算符有数十个,运算符的优先级与结合律如表所示。注意一元 运算符 + - * 的优先级高于对应的二元运算符。
(注意:相同优先级的操作符遵循结合律,从左至右运算或者从右向左)