算术操作符     +       -         *            /                     %

                         加       减      乘       除(取商)      除(取余)                                

   1:.   使用/(取商操作符)时,一般是这样的

#include<stdio.h>
int main()
{
int a = 3/5;
printf("%d\n",a);
return 0;
}
//结果:0

若想求出有小数点后的数,则必须满足数据,数字,打印类型的准确。如:

#include<stdio.h>

int main()

{

  double a = 6.0/5.0;//两个数字至少有一个得是浮点数

//当两数均是整形时,无论数据类型是int还是double都取整数即1

 printf("%lf\n",a);//注意这里不是%d

 return 0;

}

结果:1.200000

   2.%  取模操作符  取余数。其两个操作数只能是整形

#include<stdio.h>
int main()
{
int a = 6%4;
printf("%d\n",a);
return 0;
}



移位操作符     <<                           >>

                左移操作符                   右移操作符             

C语言——操作符(上)_操作符

(展示后面的)a 0010          b  1000

图中<<的意思是把a的二进制位 向左移动两为位

C语言——操作符(上)_补码_02

a = 1010         b = 0010

总结:左移操作符:左边丢弃几位,右边补几个0

          右移操作符:

                 算术右移 :     将右边丢弃的放到左边 

                逻辑右移  :   右边丢弃几位,左边补几个0  

对有符号数使用算术右移,对于无符号数,必须是逻辑右移)  

拓展:

计算机存储都是以二进制补码的形式存放的

正整数的原码,反码和补码相同

负整数的补码是将它的原码非符号位取反再加一

整数的二进制表示形式,其实有三种:原码,反码,补码

原码:直接根据数值写出的二进制序列

反码(对于负数):将原码的符号位(二进制的首位)不变,其它位按位取反,  当符号位是1时表示负号,0表示正数号                        

补码(对于负数):反码加1


如将负数-1存放在内存中,存放的是二进制的反码

-1: 原码:10000000000000000000000000000001

       反码:11111111111111111111111111111110  

        补码:   11111111111111111111111111111111    注意:对于移位操作符,不要移动负数位,这个是标准未定义的    例如:

int num = 10;
num>>-1;//是错误的

                


位操作符           &                |                   ^            

                           按位与              按位或               按位异或                                             (他们的操作数必须是整数)                        

#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
// & 按(二进制)位与
int c = a & b;
//按位与就是上下对应的二进制位,对应的位中只要有0则新的数的二进制为0,同时为1才为1
//3:00000000000000000000000000000011
//5:00000000000000000000000000000101
//c = 1:00000000000000000000000000000001

// | 按(二进制)位或
int d = a | b;
//按位或就是对应的位中只要有1则就是1,当两个都是0时才为0
//3:00000000000000000000000000000011
//5:00000000000000000000000000000101
//d = 7:00000000000000000000000000000111

// | 按(二进制)位异或
int d = a ^ b;
//对应的位相同时为0,相异为1
//3:00000000000000000000000000000011
//5:00000000000000000000000000000101
//e = 6:00000000000000000000000000000110
}

                                                                                           


赋值操作符

可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值

  1. =

int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;//薪水
salary = 20000.0;//使用赋值操作符赋值

赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//进行连续赋值

这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1;
a = x;//这样的写法更加清晰且易于调试。

2.复合赋值符

+=    -=     *=       /=    %=      >>=    <<=      &=      |=       ^=

int a = 10;
a = 100;
a += 100//等于a = a+100

a = a>>3//等于a >>= 3

注意: = 是赋值  ,   ==是判断相等


单目操作符

**

!      逻辑反操作<可以理解为否定,不的意思>

- 负值

+ 正值

& 取地址

sizeof 操作数的类型长度(以字节为单位)

~ 对一个数的二进制按位取反(包括符号位)

-- 前置、后置--

++ 前置、后置++

* 间接访问操作符(解引用操作符)

(类型) 强制类型转换

***

//!
#include<stdio.h>
int main()
{
int flag = 5;//flag为真,非0为真
printf("%d\n",!flag);//!将真的改成假的了,所以为0
return 0;
}
//结果:0

***

//sizeof
#include<stdio.h>
int main()
{
int a = 10;
int arr[10] = {0};
printf("%d\n",sizeof(arr));//计算数组的大小,结果:40
printf("%d\n",sizeof(int [10]));//40,除了数组名剩下的都是类型
printf("%d\n".sizeof(a));//计算a空间所占的大小,单位是字节
printf("%d\n".sizeof(int));//也可以直接计算类型
printf("%d\n".sizeof a);//计算字符大小时小括号可以省略,但是类型不能省
//所以sizeof是一个操作符,不是一个函数,函数的括号必须带
}

#include<stdio.h>
int main()
{
short a = 10;
int s = 5;
printf("%d\n",sizeof(s)); //4
printf("%d\n",sizeof(a));//2
printf("%d\n",sizeof(a = s + 2));//结果仍然是2,因为sizeof中的表达式是不参与运算的

return 0;
}

#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)//这里是指针,因为传过来的是地址要拿指针接收 在32为机器下 字节为4
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//(4)//同理,虽是char型,但是为指针变量在32上为4,64上为8
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr));//(1) 40
printf("%d\n", sizeof(ch));//(3) 10
test1(arr);
test2(ch);
return 0;
}


***

~对于正数是将原码全部按位取反(包括符号位)。对于负数是将其的补码全部按位取反(包括符号位)

//~
int main()
{
int a = -1;
//原码:10000000000000000000000000000001
//反码:11111111111111111111111111111110
//补码:11111111111111111111111111111111
//~ 按(二进制补码)位取反(包括符号位)
//原补码:11111111111111111111111111111111
//后补码:00000000000000000000000000000000
int b = ~a;
printf("%d\n",b);//结果:0
return 0;
}

***

//++和--运算符 :       前置++和--      后置++和--


#include <stdio.h>
int main()
{
int a = 10;
int x = ++a;//先增加a,后使用a
int y = --a;//先减小a,后使用a

int x = a++;//先使用a,再增加a
int y = a--;//先使用a,再减小a
return 0;
}

#include<stdio.h>
int main()
{

int a = 1;
int b = (++a) + (++a) + (++a);//结果:由于编译器系统的不同坑能有2种结果12/10
printf("%d\n",b);
return 0;

}


***

  • * 间接访问操作符(解引用操作符)
  • &    取地址(注意a & b中&是按位与,&a中&是取地址符)
#include<stdio.h>
int main()
{
int a = 10;
printf("%p\n",&a);//取a的地址,并打印地址
int* pa = &a;//这里*说明pa是指针变量,pa是用来存放地址的
*pa = 20;//* 间接访问操作符(解引用操作符),将a的值变成了20
printf("%d\n",a);
return 0;
}

***

(类型)    强制类型转换

int main()
{
int a = (int)3.14;
return 0;
}