操作符实例讲解

来源:互联网 发布:销存软件排名 编辑:程序博客网 时间:2024/05/18 04:40
一、操作符
1、算数操作符: +(加)       -(减)      * (乘)    / (除)    % (取模)
2、移位操作符:<<(左移)      >>(右移)
3、位操作符‘:   &(按位与)     | (按位或)   ^(按位异或,相同为0,不同为1) 
4、关系操作符: <(小于)   >(大于)  ==(等于)  !=(不等于)  <=(小于等于或不大于)  >=(大于等于或不小于) 
5、单目操作符:!(逻辑反操作) -(负值)  +(正值)   &(取地址)   ~(二进制按位取反)   --(自减)  ++(自增) 
        *(间接访问操作符)   sizeof(操作数的类型长度,以字节为单位)
6、条件操作符:    表达式1?表达式2 :表达式3  (三目操作符   列:a=5>3(表达式1) 5(表达式2): 3(表达式2);5>3 成立a=5,不成立a=3)
7、赋值操作符:  =(赋值)
8、逻辑操作符:&&(逻辑与)         ||(逻辑或)


1、算数操作符实例:

#include<stdio.h>
#include<stdlib.h>
int main()
{
 int num1=3;
 float num2=3.3;
 double num3=3.5;
 printf("整型num1=%d\t单精度浮点型num2=%f\t双精度浮点型num3=%lf\n",num1,num2,num3);
 printf("\n整型除法num1/2=%d\n",num1/2);//整数除法
 printf("整型除以浮点数运算num1/2.0=%d\n",num1/2.0);//(输出整型,浮点数运算)错误结果0
 printf("整数浮点型输出num1/2=%f\n",num1/2);//整型运算,后转换成浮点型数输出
 printf("整数除以浮点型数,浮点型输出num1/2.0=%f\n",num1/2.0);//整型数浮点型运算输出,至少有一变量为浮点型,2.0即为浮点型数
 printf("\n单精度浮点型运算输出num2/2=%f\n",num2/2);//单精度浮点型除法
 printf("双精度浮点型运算输出num3/2=%lf\n",num3/2);//双精度浮点型除法
 printf("浮点型转换整型运算整型输出(int)num3/2=%d\n",(int)num3/2);//浮点型强制转换成整型除法运算后输出
 printf("浮点型运算整型输出num3/2=%d\n",num3/2);//浮点型除法,转换成整型输出,结果错误
 printf("\n整型取模运算num1%%2=%d\n",num1%2);//取模运算仅能为整运算,注%%表示打印%
 printf("浮点型转换整型取模运算(int)num2%%2=%d\n",(int)num2%2);//整型变量强制转换成整型,变量仅保留整数部分,可进行取模运算
 //printf("%d\n",num2%2);//浮点数不可进行取模运算
 system("pause");
 return 0;
}


注意:浮点型运算输出,至少有一变量为浮点型数( printf("整数除以浮点型数,浮点型输出num1/2.0=%f\n",num1/2.0);//整型数浮点型运算输出,至少有一变量为浮点型,2.0即为浮点型数)
           取模运算必须是整型运算

2、移位操作符:

左移符:<<     (列:(5<<2)5--->0101左移2位为:010100--->20)
右移符:>>     (列:(5>>2)5--->0101右移2位为:0001----->1)
应用:

//判断一个数是正数还是负数
#include<stdio.h>
#include<stdlib.h>
int main()
{
 int num=01;
    printf("输入数字:");
 scanf("%d",&num);
 if((num>>31)&1)//32位最高位表示正负数,1表示负数,0表示正数
  printf("负数\n");
 else
  printf("正数\n");
 system("pause");
 return 0;
}


//1.写一个函数返回参数二进制中 1 的个数
#include<stdio.h>
#include<stdlib.h>
int count_one_bit(int num);
int main()
{
 int num=0;
 int count=0;
 printf("输入数字:");
 scanf("%d",&num);
 count=count_one_bit(num);
 printf("二进制为一的有%d位\n",count);
 system("pause");
 return 0;
}
int count_one_bit(int num)
{
 int n=0;
 int i=0;
 int num1=num;
 while(num1>0)
 {
     num1=num>>i;
 if((num1&1)==1)
 {
  n++;
 }
 i++;
 }
 return n;
}


//2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。

#include<stdio.h>
#include<stdlib.h>
void bit_search(int num);
int main()
{
 int num=0;
 printf("输入数字:");
 scanf("%d",&num);
 bit_search(num);
 system("pause");
 return 0;
}
void bit_search(int num)
{
 int n1=15;//奇数位下标
 int n2=15;//偶数位下标
 int i=0;//移位变量
 int bit_odd[16]={0};//保存二进制数,奇数位最多有16位(共32位)
 int bit_even[16]={0};
 int num1=num;//移位后数值,用于判断终止
 while(num1>0)
 {
  num1=num>>i;
  if(i%2==0)
  {
  bit_odd[n1]=(num1&1);
  n1--;
  }
  else
  {
   bit_even[n2]=(num1&1);
   n2--;
  }
  i++;
 }
 printf("奇数位二进制:");
 for(i=0;i<16;i++)
 printf("%d",bit_odd[i]);
 printf("\n偶数位二进制:");
 for(i=0;i<16;i++)
 printf("%d",bit_even[i]);
}

//两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int compare(int num1,int num2 );
int main()
{
 int num1=0;
 int num2=0;
 int count=0;
 printf("输入数字num1:");
 scanf("%d",&num1);
 printf("输入数字num2:");
 scanf("%d",&num2);
 count=compare(num1,num2);
 printf("有%d位不同\n",count);
 system("pause");
 return 0;
}

int compare(int num1,int num2)
{
   int i=0;
   int n=0;
   //保证为正数比较,计算机存储的是二进制的补码,正数补码=原码,负数补码=原码取反+1
   num1=sqrt(pow(num1,2.0));//sqrt开根号函数,qow次方函数。注:qow函数至少有1个数是浮点数运算
   num2=sqrt(pow(num2,2.0));
   for(i=0;i<32;i++)
   {
    if(((num1>>i)&1)!=((num2>>i)&1))//比较位是否相同
     n++;
   }
   return n;
}


3、位操作符:
&:与运算,有0即为0。即1&1=1,1&0=0,0&0=0
|: 或运算,有1即为1。即1|1=1,1|0=1,0|0=0
^:异或,相同为0不同为1。即1^1=0,1^0=1,0^0=0

注:计算机中存储的是数值的二进制的补码;
正数补码=原码;列:5--->0101
负数补码=原码取反+1  列:5--->0101---(取反)-->1010---(加1)--->1011(-5补码)
&的应用可看上面移位操作符的案例(|的使用与之类似)
^的应用可交换两个变量。
   ^交换两个变量       算数操作符交换两个变量
列:a=a^b;                  a=a+b;
       b=a^b;//b=a          b=a-b;//a
       a=a^b;//a=b          a=a-b;//b
具体案例可访问:http://blog.csdn.net/wejboke626/article/details/78058248


4、逻辑操作符:

&&:逻辑与,表达式1&&表达式2;表达式1不成立时,结果不成立,不在运算表达式2。表达式1成立时,运算表达式2。
||:逻辑或,表达式1||表达式2;表达式1成立时,结果成立,不在运算表达式2。表达式1不成立时,运算表达式2


5、单目操作符:

sizeof:操作数的长度,以字节为单位。 列:sizeof(数组名arr)/sizeof(arr[0]);//求数组大小(多少个元素)
++:自增,a++等于a=a+1。  ++a先加一运算后赋值
--:自减,a--等于a=a-1。--a先减一运算后赋值

例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
 int num1=0;
 int num2=0;
 int num3=0;

 num2=num1++;//先将num1赋给num2,后num1加1。即num2=0,num1=1;
 num3=++num2;//先num2加1,后将num2值赋给num3。即num2=1,num3=1;

 printf("num1=%d\tnum2=%d\tnum3=%d\n",num1,num2,num3);
 system("pause");
 return 0;
}
 
6、关系操作符与赋值操作符 
赋值操作符(=)与关系操作符(==)不可写错,在判断语句中最好将常量数值放在左边,从而便于查找此错误(列:if(1==a)...)