操作符
一.算术操作符: + - * % /
1.除了%操作符之外,其他的几个操作符可以作用与整数和浮点数,如:5%2.0//error.
2.对于操作符,如果两个操作数都为整数,执行整数除法而只要有浮点数执行的就是浮点数除法。
3.%操作符的两个操作数必须为整数。
二.移位操作符:<< >>
1.<<左移操作符:左边抛弃,右边补0
int num = 10;
//00000000000000000000000000001010//num在内存中的二进制
num<<1
//00000000000000000000000000010100
2.>> 右移操作符 ( 移动的是二进制位)
右移操作符有两种移动:
(1).算术右移,移动的是补码,右边丢弃,左边以和符号位一样的数字进行补位:0为正,1为负。
(2).逻辑右移,右边丢弃,左边补0。
如果为正数,代码演示如下:
#include <stdio.h>
int main()
{
int a = 16;//16放在a里,a是整型,4个字节,32个比特位
int b=a>>1;//将a的值右移赋值给b,00000000000000000000000000010000
//右移一个把0丢弃,左边补0
printf("%d\n",b);
return 0;
}
运行结果为:8
如果为负数:例如:(代码如下:)
#include <stdio.h>
int main()
{
int a = -1
//我们假设,a是-1。原码是:10000000000000000000000000000001
//对于正数,反码与其原码相同;对于负数,反码是在其原码的基础上,符号位保持不变,其他位按位取反,即把0变为1,1变为0。则反码是:11111111111111111111111111111110
//补码是:对于正数,补码与其反码相同;对于正数,其补码与其原码相同。而对于负数,其补码是通过对其原码按位取反后加1得到。(即反码最后一位加1得到补码)补码:11111111111111111111111111111111
//这样子内存中存储-1的补码为32个1
int a = >>1;
//算术右移:11111111111111111111111111111111//左边用原值的符号位填充
//逻辑右移:01111111111111111111111111111111//右移,左边补0;
}
警告⚠:
对于移位运算符,不要移动负数位,这个是标准为定义的。
例如:
int num =10;
num>>-1;//error
三、位操作符
1.位操作符:
& //按位与 | //按位或 ^按位异或
注:他们的操作数必须是整数
2.位操作符的使用
(1)&有一个0则为0,两个为1才为1.
例如:
#include <stdio.h>
int main()
{
int a = 3;//3的二进制是011,int整型则是4个字节,32个bie位
//则是: 00000000000000000000000000000011
int b = 5;//同理:00000000000000000000000000000101
int c = a & b;// 00000000000000000000000000000001
printf("%d", c);
return 0;
}
运行结果:
(2)按位或 |
按位或:按照二进制或,有一个1则为1
例如:
#include <stdio.h>
int main()
{
int a = 3;// 00000000000000000000000000000011;
int b = 5;// 00000000000000000000000000000101;
int c = a | b;//00000000000000000000000000000111;
printf("%d", c);//c=1+1*2+1*2*2=7;
return 0;
}
运行结果如下
(3)按位异或^
^(按2进制按位异或)//相同为0,相异为1
例如:
#include <stdio.h>
int main()
{
int a = 3;// 00000000000000000000000000000011;
int b = 5;// 00000000000000000000000000000101;
int c = a ^ b;//00000000000000000000000000000110;
printf("%d", c);//c=0+1*2+1*2*2=6;
return 0;
}
运行结果如下:
(4)一道变态的面试题
题目:不能创建临时变量(第三个变量),实现两个数的交换,代码有两种方法,详细的发到了我的作品里,其中一种如下:
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d b=%d", a, b);
return 0;
}
四.赋值操作符
+= -= *= /= %=
>>= <<= &= |= ^=
其中这些运算符都可以写成符合的效果
比如:
int x= 10;
x= x+ 10;
x+= 10;//复合赋值
//其他运算符也都可以这样写,这样写的好处是更加简洁
五.单目操作符
1.单目操作符的内容:!- + & sizeof ~ ++ *(间接访问操作符 )(解引用操作符) (类型)强制转换类型
2.演示代码
#include <stdio.h>
int main()
{
int a=10;
int*p=&a;
//*p,解引用操作符——>通过p里面存放的地址找到对象a中存放的值
//*p=20,a中的值变为20
*p=20;
printf("%d",a);
return 0;
}
3.sizeof的使用:
sizeof计算变量所占空间的大小:单位是字节
注意:sizeof()内部不参与运算,例如sizeof(s=a+5);
例如:
char *p=&c;
printf("%d",sizeof(p));//4
int arr[10]={0};
printf("%d",sizeof(arr));//40
4.~的使用按位取反(对一个数的二进制按位取反)
#include <stdio.h>
int main()
{
int a = 0;
//(按二进制的每一位取反)—>对补码按位取反
//00000000000000000000000000000000补码按位取反
//11111111111111111111111111111111
//11111111111111111111111111111110反码(补码减一)
//10000000000000000000000000000001原码(转化为10进制-1)
printf("%d\n",~a);
return 0;
}
5.*间接访问操作符(解引用操作符)
#include <stdio.h>
int main()
{
int num = 20;
int* p = #
*p = 30;//解引用操作符
printf("%d\n",num);//30
return 0;
}
6.(类型) 强制类型转换
#include <stdio.h>
int main()
{
int a = (int)3.14;
//int a=int(3.14)->errror
printf("%d", a);//3
return 0;
}
六.关系操作符
关系操作符:> >= <= < != ==
七.逻辑操作符
&& ||
&&的举例
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf(" %d %d %d %d",a,b,c,d);//a=1 b=2 c=3 d=4 i=0
return 0;
}
||的举例
#include <stdio.h>
int main()
{
int i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;//有一真则真就短路了
printf(" %d %d %d %d",a,b,c,d);//a=2 b=2 c=3 d=4 i=1
return 0;
}
八.条件操作符
1.exp1?exp2:exp3(三目操作符)
表达式1如果为真则输出表达式2,反之输出表达式3
九.逗号表达式
内容:(从左到右依次执行,结果为最后一个表达式的结果)
十.下标引用[ ]
[ ]下标引用操作符
操作数:一个数组名+ 一个索引值[ ]
例如:
int arr[10];//创建数组
arr[9] = 10;//使用下标引用操作符
//[ ]的两个操作数是arr和9
十.创建一个结构体
struct stu// struct 结构体关键字
{
//成员变量
char name[20];
int age;
char id[20];
};
int main()
{
struct stu s1={"工藤新一", 18,“5201314”};
printf("%s\n",s1.name);
printf("%s\n",s1.age);
printf("%s\n",s1.id);
return 0;
}