算术操作符:+(加)、-(减)、*(乘)、/(除)、%(模)
/(除)
两操作数都为整数,执行整数除法,只要有浮点数,执行的就是浮点数除法
%(模)取余数
eg:5 % 2 = 1 5 除以 2 的 2 余 1(结果)
注意:左操作数和右操作数必须都是整数
移位操作符:>>(右移操作符)、<<(左移操作符)
>> 右移操作符
两种移法:
1、算术右移:(右移一位有除 2 的效果)
右边丢弃,左边补原符号位,正数补 0,负数补 1
2、逻辑右移:
右边丢弃,左边补 0
两种方法移动的都是二进制
<< 左移操作符
一种移法:
左边丢弃,右边补 0
位操作符(二进制): &(按位与)、|(按位或)、^(按位异或)
&(按位与)
两个同时为 1 才为 1
|(按位或)
有 1 个 1 就是 1,无 1 记 0
^(按位异或)
相同为 0 ,不同为 1
赋值操作符:=
变量在创建时给的值叫 初始化,变量已有后给的值叫 赋值
连续赋值:从右往左
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = b = a + 2;
printf("%d", c);
return 0;
}
复合赋值操作符:+=、-=、*=、/=、%=、>>=、<<=、^=、&=、|=
基本原理相同
eg:a += b 意思就是 a = a + b
a -= b 意思就是 a = a - b
a |= b 意思就是 a = a | b
单目操作符:!(逻辑反操作)真变成假,假变成真
&(取地址)取变量地址 和指针配合使用
-(负值)
+(正值)
sizeof(操作符的类型长度,以字节为单位)使用时后面需要括号()指明对象
~(按位取反)(二进制中 1 变成 0,0 变成 1)
--(前置后置--)
++(前置后置++)
*(间接访问操作符)(解引用操作符)
(类型)(强制类型转换)
!(逻辑反操作)真变成假,假变成真
*(间接访问操作符)(解引用操作符)
逻辑运算符: && 逻辑与、|| 逻辑或、! 逻辑非
&& 逻辑与,当左操作符为假 0 时,右操作符不用运算
|| 逻辑或,当左操作符为真 1 时,有操作符不用运算
条件操作符:exp1 ?exp2:exp3
int a = (b > c ? 1:0);
逗号操作符:,
int a = ( 表达式 , 表达式 , 表达式 , 表达式 );
从左往右算,最后结果为 a 的值
点操作符: . 用于操作结构体成员
#include<stdio.h>
struct stu
{
int age;
char name[10];
char id[20];
};
int main()
{
struct stu s1 = { 20,"lmx","202142211"};
/*printf("年龄%d\n", s1.age);
printf("%s\n", s1.name);
printf("%s\n", s1.id);*/
struct stu* ps = &s1;
printf("%d\n", ps->age);
printf("%s\n", ps->name);
printf("%s\n", ps->id);
return 0;
}
整型提升,计算过程中有些是达不到整形,变成整形再参与运算
#include<stdio.h>
int main()
{
char a = 3;
//00000000000000000000000000000011
//a 内只能存一个字节(8位)
//00000011 - a
char b = 127;
//00000000000000000000000001111111
//b 内只能存一个字节(8位)
//01111111 - b
char c = a + b;
//a 和 b 相加
//00000000000000000000000000000011 - a
//00000000000000000000000001111111 - b
//00000000000000000000000010000010
//
//c 内只能存一个字节(8位)
//10000010 - c
printf("c=%d\n", c);//打印原码
//11111111111111111111111110000010 - 补码
//原码取反加一得到补码,补码减一取反得到原码
// 补码减一得到反码
//11111111111111111111111110000001 - 反码
//10000000000000000000000001111110 - 原码
//-126
return 0;
}
整数有三种表达形式:(正数的原码、补码、反码都是一样的)
原码、反码、补码(存储到内存中)
eg: -1
原码:1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
首位符号位 + 二进制数
反码:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
符号位不变,其他位按位取反
补码:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
反码加 1 得到补码,内存里放的是补码
算术转换:
long double
double
float
unsigned long int
long int
int
不同的类型之间的运算,小的类型会变成大的类型进行运算
操作符的属性:
1、操作符的优先级
2、操作符的结合性
3、是否控制求值顺序