运算符

来源:互联网 发布:js查找字符串中的字符 编辑:程序博客网 时间:2024/05/17 20:15

计算机中运算符的概念和数学中运算符的概念没什么区别,前面也已经用到像=、+、*这几个运算符。

计算机中的运算符有:

算术运算符:单目:+、-、++、--

                      双目:+、-、*、/、%

说明:单目中的+、-就是代表正负号,++、--是自增和自减运算符,作用是自身+1或减1。分别可以放在变量的前面和后面。例如++a和a++。++a和a++的区别是优先级的区别。++a会先将a+1再作本语句的其它运算,a++会作完本语句的其它运算再将a+1。--a和a--也是相同的道理。我们看示例1。

示例1:

#include <stdio.h>int main(){    int a = 1;int b = 1;int c = a++;int d = ++b;printf("a的值是%d\nb的值是%d\nc的值是%d\nd的值是%d\n",a,b,c,d);return 0;}

运行结果:


程序分析:

int c = a++;是先将a的值赋给c然后自己再+1,所以c的值是1。而int d = ++b;是先将b的值+1,再将b的值赋给d,所以d的值是2。


双目运算符中+、-、*、/分别代表加减乘除。%是取余,也就是求余数。例如7 % 2 = 1。


赋值运算符:=、+=、-=、*=、/=、%=

说明:赋值运算符的作用就是将赋值运算符右边的值赋给左边的变量。例如前面的int a = 5;

其余的+=、-=、*=、/=、%=是复合的赋值运算符,他们的作用我们看一个示例就明白了。

示例2:

#include <stdio.h>int main(){int a = 5;double b = 3.2;a += 2; //等价于a = a + 2;b *= 2; //等价于b = b * 2;printf("%d\n",a);printf("%f\n",b);return 0;}
运行结果:


程序分析:

看了这个程序复合运算符的作用我想已经很清楚了,就是先将变量自身的值和复合赋值运算符的右边的数先做一次运算,再把结果赋值给变量自身。


关系运算符:>、<、>=、<=、==、!=

说明:关系运算符一般是用在条件语句,条件语句在后面的文章再讲。这些运算符的作用就是将条件运算符的左右两边的值进行比较。返回的结果是真或者假。>、<、>=、<=这四个和数学的关系运算符一样,分别是大于、小于、大于等于(不小于)、小于等于(不大于)。而==是等于,!=是不等于。具体用法在使用条件语句时再讲。

注:不要把==写成=。


逻辑运算符:&&、||、!

说明:&&、||、!分别对应数学上的且、或、非。具体用法在使用条件语句时再讲。


位运算符:单目:&、|、^、~、<<、>>

说明:位运算符都是针对二进制数的位进行操作的运算符。&是位且运算符、|是位或运算符、^是异或运算符、~是取反运算符、<<是左移运算符、>>右移运算符。他们的作用分别如下:

&位且运算符:两个二进制数字的每一位进行比较,若两个都是0或有一个为0则为0,若两个都是1则为1。

|位或运算符:两个二进制数字的每一位进行比较,若两个都为0则为0,若两个都是1或有一个是1则为1。

^异或运算符:两个二进制数字的每一位进行比较,若两个数相同则为0,若两个数不同则为1。

~取反:将一个二进制数的每一位进行取反,也就是0改为1,1改为0。

<<左移运算符:将一个二进制数的每一位向左移动,右边用0填满。

>>右移运算符:将一个二进制数的每一位向右移动,右边用0填满。

下面看一个示例:

示例3:

#include <stdio.h>int main(){short a = 13;short b = -6;short c = a & b; short d = a | b; short e = a ^ b; short f = ~a;   short g = a << 2;short h = a >> 2;printf("c = %d\nd = %d\ne = %d\nf = %d\ng = %d\nh = %d\n",c,d,e,f,g,h);return 0;}

运行结果:



程序分析:

short类型为两个字节,16位。

a = 13,那么a的在计算机中的表示为:0000-0000 0000-1101。

b = -6,那么b在计算机中的表示为:1111-1111 1111-1010(记住,计算机是用补码表示数字的)。

那么

c = a & b的实际计算过程为:

0000-0000 0000-1101

&1111-1111 1111-1010

-------------------------------

0000-0000 0000-1000 = 8


d = a | b的实际运算过程为:

0000-0000 0000-1101

| 1111-1111 1111-1010

-------------------------------

  1111-1111 1111-1111 = -1


e = a ^ b的实际运算过程为:

0000-0000 0000-1101

^1111-1111 1111-1010

-------------------------------

   1111-1111 1111-0111 = -9


f = ~a的实际运算过程为:

~0000-0000 0000-1101

-------------------------------

1111-1111 1111-0010 = -14


g << 2的实际运算过程为:

2<<0000-0000 0000-1101

-------------------------------

       0000-0000 0011-0100 = 52


h >> 2的实际运算过程为:

2>>0000-0000 0000-1101

-------------------------------

       0000-0000 0000-0011 = 3
注:

1、左移运算符<<每移一位相当于把概数的值乘以2,移了N位就相当于把该数乘以2的N次方。右移运算符每移一位相当于除以2(舍去余数)。移了N位就相当于除以2的N次方。而且位运算符的运算速度较快,例如2<<2的运算速度比2*=2*2快。

2、位运算符还可以与赋值运算符=复合成&=、|=、^=、<<=、>>=这五个运算符。他们的用法由+=、-=那些可以类推。例如int a = 2;那么a <<= 2;后a变成8。


条件运算符:?: 

说明:通过一个判断条件来为一个变量赋值。

示例4:

#include <stdio.h>int main(){int a = 10;int b = (a > 5) ? 20 : 30;printf("b = %d\n",b);return 0;}

运行结果:



程序分析:

在对b进行赋值时首先对a是否大于5进行判断,若a>5则把20赋给b,若a<5则把30赋给b。